UITextField внутри UIColletionViewCell становитьсяFirstResponder - PullRequest
0 голосов
/ 14 декабря 2018

Я знаю, что этот вопрос может иметь много ответов на SO.Но, попробовав каждое решение, найденное в сети (+ некоторые из моих пользовательских изобретений ...), я все еще не могу сделать то, чего хочу достичь.

Вот история:

У меня есть UICollectionViewCell с вложенным в него подклассом UITextField.

Вот мой подкласс:

class CustomTextField: UITextField {

    private let padding = UIEdgeInsets(top: 6.0, left: 0.0, bottom: 0.0, right: 2.0)

    private lazy var lineView: UIView = {
        let lineView = UIView()
        lineView.translatesAutoresizingMaskIntoConstraints = false
        lineView.isUserInteractionEnabled = false
        lineView.frame.size.height = 2
        lineView.backgroundColor = UIColor.tiara
        return lineView
    }()

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }
    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    func toggleColors() {
        if isFirstResponder {
            lineView.backgroundColor = .black
        } else {
            lineView.backgroundColor = UIColor.tiara
        }
    }
}

private extension CustomTextField {
    func commonInit() {
        addSubview(lineView)
        constraintLineView()
        textColor = UIColor.tiara
    }

    func constraintLineView() {
        lineView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
        lineView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
        lineView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        lineView.heightAnchor.constraint(equalToConstant: 2.0).isActive = true
    }
}

А вот код, который я использую в моем UICollectionViewCell:

@discardableResult
func setFirstResponder() -> Bool {
    return customTextField.becomeFirstResponder()
}

func endEditing() {
    customTextField.resignFirstResponder()
}

Результат customTextField.becomeFirstResponder всегда false.

Он вызывается из моего UIViewController:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    guard indexPath.row != 0 else { return }

    dispatchService.stop()
    let topIndexPath = IndexPath(item: 0, section: 0)

    let topCell: Cell = collectionView.dequeueReusableCell(for: topIndexPath)
    topCell.endEditing()
    service.data.rearrange(from: indexPath.row, to: 0)
    update()

    collectionView.performBatchUpdates({
        collectionView.moveItem(at: indexPath, to: topIndexPath)
        collectionView.scrollToItem(at: topIndexPath, at: .top, animated: true)
    }) { (_) in
        let secondCell: Cell = collectionView.dequeueReusableCell(for: topIndexPath)
        secondCell.setFirstResponder()
        self.dispatchService.reset()
    }
}

Я действительно не знаю, с чего начать, это последнее решение, с которым я пришел, и оно все еще остается без отображаемой клавиатуры.

Я работаю на реальном устройстве, iPhone X, iOS 12.1.

1 Ответ

0 голосов
/ 15 декабря 2018

Возможно, у меня нет тихого правильного ответа, но, я думаю, проблема в том, как вы помещаете свою камеру внутрь collectionView(didSelectItemAt:).

Вы используете dequeueReusableCell вместо cellForItem(at:) для получения своих клеток.Таким образом, вы создаете ячейку многократного использования и не получаете ту, которая вас интересует.

...