UICollectionViewController

UICollectionViewController

我正在尝试设计一个多步骤注册菜单。为此,我将UICollectionViewController用于屏幕大小的单元格。在这些单元格中,我有一个UITextView来提问,还有一个UITextField来收集答案。我还有一个页面对象,用于在设置时从uicollectionviewcontroller传入信息。
我现在遇到的问题是,在每三页之后,我从3页前输入的文本字段就会重复,而不是显示占位符。我注意到了另一个问题,这些单元格的实例化次数似乎只有3次,而不是6次。实例化顺序也很奇怪。一开始它只做一次,然后按一下按钮,再按两次,然后再不按了。
怎么能解决这个问题,我真的很挣扎,我不知道怎么回事。
这是我的代码:

import UIKit

class OnboardingPageViewCell: UICollectionViewCell{

    override init(frame: CGRect) {
        super.init(frame: frame)
        print("made a page")
        setupView()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    var oboardingPage = NewOnboardingPage() {
        didSet{
            reload()
        }
    }

    private var questionTextField: UITextView = {
        var q = UITextView()
        q.textColor = UIColor.white
        q.textAlignment = .left
        q.font = UIFont(name: "Avenir-Black", size: 25)
        q.isEditable = true
        q.isScrollEnabled = false
        q.backgroundColor = UIColor.black
        q.translatesAutoresizingMaskIntoConstraints = false
        print("made aquestion field")
        return q
    }()

    private var answerField : CustomTextField = {
        let tf = CustomTextField.nameField
        print("made an answer field")
        return tf
    }()

    private func setupView(){
        backgroundColor = UIColor.white

        addSubview(questionTextField)
        questionTextField.topAnchor.constraint(equalTo: topAnchor, constant: 120).isActive = true
        questionTextField.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
        questionTextField.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.90).isActive = true
        questionTextField.heightAnchor.constraint(equalToConstant: 90).isActive = true

        addSubview(answerField)
        answerField.topAnchor.constraint(equalTo: questionTextField.bottomAnchor, constant: 20).isActive = true
        answerField.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
        answerField.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.90).isActive = true
        answerField.heightAnchor.constraint(equalToConstant: 90).isActive = true
    }

    private func reload(){
        questionTextField.text = oboardingPage.question
        answerField.placeholder = oboardingPage.answerField
    }
}

class NewOnboardingPage {
    var question : String?
    var answerField : String?
}


import UIKit

class SignUpController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    private let cellId = "cellId"
    private var pages = [NewOnboardingPage]()

    override func viewDidLoad() {
        super .viewDidLoad()
        setupSignUpControllerView()
        addPages()
    }

    private  func addPages(){
        let namePage = NewOnboardingPage()
        namePage.question = "What's your name?"
        namePage.answerField = "What's your name?"
        pages.append(namePage)

        let birthDayPage = NewOnboardingPage()
        birthDayPage.question = "When's your birthdate?"
        birthDayPage.answerField = "When's your birthdate?"
        pages.append(birthDayPage)

        let userNamePage = NewOnboardingPage()
        userNamePage.question = "Choose a user name."
        userNamePage.answerField = "Choose a user name."
        pages.append(userNamePage)

        let passWordPage = NewOnboardingPage()
        passWordPage.question = "Set a password"
        passWordPage.answerField = "Set a password"
        pages.append(passWordPage)

        let emailAuthPage = NewOnboardingPage()
        emailAuthPage.question = "What's your email?"
        emailAuthPage.answerField = "What's your email?"
        pages.append(emailAuthPage)

        let phoneNumberPage = NewOnboardingPage()
        phoneNumberPage.question = "What's your phone number?"
        phoneNumberPage.answerField = "What's your phone number?"
        pages.append(phoneNumberPage)
    }

    private func setupSignUpControllerView(){
        collectionView?.backgroundColor = .white
        collectionView?.register(OnboardingPageViewCell.self, forCellWithReuseIdentifier: cellId)
        collectionView?.isPagingEnabled = true
        collectionView?.isScrollEnabled = true

        if let layout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
            layout.scrollDirection = .horizontal
            layout.minimumLineSpacing = 0
        }

        view.addSubview(nextButton)
        nextButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 400).isActive = true
        nextButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        nextButton.widthAnchor.constraint(equalToConstant: 250).isActive = true
        nextButton.heightAnchor.constraint(equalToConstant: 60).isActive = true
    }

    private let nextButton: UIButton = {
        let button = UIButton(type: .system)
        button.backgroundColor = UIColor.RED
        button.setTitle("next", for: .normal)
        button.setTitleColor(UIColor.white, for: .normal)
        button.titleLabel?.font = UIFont(name: "Avenir-Black", size: 25)
        button.layer.cornerRadius = 30
        button.translatesAutoresizingMaskIntoConstraints = false
        button.addTarget(self, action: #selector(turnNextPage), for: .touchUpInside)
        return button
    }()

    @objc private func turnNextPage() {
        let visibleItems: NSArray = collectionView?.indexPathsForVisibleItems as! NSArray
        let currentItem: IndexPath = visibleItems.object(at: 0) as! IndexPath
        let nextItem: IndexPath = IndexPath(item: currentItem.item + 1, section: 0)
        if nextItem.row < pages.count {
            collectionView?.scrollToItem(at: nextItem, at: .left, animated: true)
        }
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return pages.count
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! OnboardingPageViewCell
        cell.oboardingPage = pages[indexPath.item]
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: view.frame.width, height: view.frame.height)
    }

}


import UIKit

class CustomTextField: UITextField, UITextFieldDelegate {
convenience init() {
        self.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))

        self.allowsEditingTextAttributes = false
        self.autocorrectionType = .no

        self.tintColor = UIColor.RED
        self.translatesAutoresizingMaskIntoConstraints = false
    }


    override func willMove(toSuperview newSuperview: UIView?) {
        addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        editingChanged(self)
    }

    @objc func editingChanged(_ textField: UITextField) {
        guard let text = textField.text else { return }
        textField.text = String(text.prefix(30))
    }

    override func selectionRects(for range: UITextRange) -> [Any] {
        return []
    }

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        if action == #selector(paste(_:)) ||
            action == #selector(cut(_:)) ||
            action == #selector(copy(_:)) ||
            action == #selector(select(_:)) ||
            action == #selector(selectAll(_:)){
            return false
        }
        return super.canPerformAction(action, withSender: sender)
    }

}


override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! OnboardingPageViewCell
        cell.answerField.text = nil
        cell.oboardingPage = pages[indexPath.item]
        return cell
    }

最佳答案

1-由于单元格出列,textfield显示的是相同的数据,而不是占位符,因此必须挂接这些属性并清除它们在cellForRowAt中的内容
2-实例化为3而不是6 aslo单元出列
解决:
将两个属性添加到模型NewOnboardingPage将它们命名为currentQuestion和currentAnswer,并作为用户输入滚动到下一页将它们保存在modelarray中,以便在单元格内部和外部进行全局访问在cellForRowAt中滚动时将这些值设置为textfield和textView

关于ios - UICollectionViewCell的UiTextField,在UICollectionViewController中重叠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47961579/

10-12 14:49