在UITableViewCell中的UITextView未能在“ textViewDidBeginEditing”方法中首次分配其委托

时间:2019-06-12 16:13:03

标签: ios swift uitextviewdelegate

原始帖子:

根据标题中的建议。我已确保在cellForRowAt方法中初始化单元格时,将在该方法内为该单元格的textview分配一个委托。实际上,单元格中还有另一个文本字段,并且对于文本字段也可以正常工作,即可以按预期方式调用文本字段委托方法。但是,当涉及到textview时,我做过同样的事情,但是在单元格初始化之后,该委托似乎变成了nil,并且未按预期调用textview委托方法。

我在游乐场中尝试过:设置一个包含textview的视图控制器,为其分配一个委托,并向textViewDidBeginEditing方法中添加一条打印消息,并在我点击时按预期方式打印出该消息文本视图。我真的不确定是什么原因导致了这个问题。

我唯一确定的是,在cellForRowAt tableview数据源方法中,该委托仍然存在。我不知道之后会发生什么。有什么想法吗?

仅供参考:category是文本字段,detail是文本视图。

用于cellForRowAt方法

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    //the rest of the added cells for other categories
    let cellForOtherCategories = tableView.dequeueReusableCell(withIdentifier: addListTableViewCellID, for: indexPath) as! AddListTableViewCell
    cellForOtherCategories.addListTableViewCellDelegate = self

    cellForOtherCategories.category.delegate = self

    print("Before delegate is set")

    cellForOtherCategories.detail.delegate = self

    print("After delegate is set.")

    print(cellForOtherCategories.detail.delegate.debugDescription)


    return cellForOtherCategories
}

对于文本视图委托:

func textViewDidBeginEditing(_ textView: UITextView) {
    print("This should go first")
}

更新1:

仅在第二次点击文本视图时才调用文本视图委托方法。但这仍然很奇怪,为什么在点击文本视图时不调用委托方法第一次开始。

为说明这种情况,我们假设有一个文本视图,分配了一个委托,已实现textViewDidBeginEditing,其中包含打印消息。当我第一次点击文本视图时,该消息未打印。但是,在我将文本视图辞职为第一响应者(点击其他位置)并再次点击文本视图之后,就调用了委托方法。

更新2:

由于textViewShouldBeginEditingtextViewDidBeginEditing之前被调用,因此我尝试将打印消息放入textViewShouldBeginEditing中,以测试此委托方法是否有效。事实证明这是可行的。因此,现在进一步深入研究该问题,为什么为什么第一次调用textViewDidBeginEditing却不调用另一个方法?

更新3:

在我将单元格的代表分配为自己,并相应地调整了程序之后,再次出现了相同的问题。由于在操场上进行的测试有效,所以我认为问题实际上与委托的分配无关。其他原因引起了问题。当我考虑我的程序和测试代码之间是否有区别时,是观察者。 (或者可能是其他东西?但是我无法弄清楚,因为其他视图主要是各种视图,这些视图对调用textview委托方法不会有任何影响。)

我有一个观察者,其通知是UIResponder.keyboardWillHideNotification,因此,观察者的方法将并且应该仅在我轻击文本视图并随后调用文本视图委托方法之后才调用。

当涉及观察者时,UITextView是否发生了幕后事件,因此第一次单击时未调用textview委托方法textViewDidBeginEditing?由于文本字段没有问题。

1 个答案:

答案 0 :(得分:0)

这很麻烦,因为具有tableView的ViewController将委托多个textViews和textFields。我建议在AddListTableViewCell内创建一个安装函数。

您将在其中设置代表,应该是每个单元格。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cellForOtherCategories = tableView.dequeueReusableCell(withIdentifier: addListTableViewCellID, for: indexPath) as! AddListTableViewCell

    cellForOtherCategories.setupCell()

    return cellForOtherCategories
}

然后,在AddListTableViewCell上,您将具有以下方法:

func setupCell() {
    self.categoryTextField.delegate = self

    self.categoryTextView.delegate = self

    //And whatever you need..
}

最后将扩展名添加到该单元格以便能够对其进行分配。

extension AddListTableViewCell: UITextViewDelegate {

    func textViewDidBeginEditing(_ textView: UITextView) {
        print("There you go")
    }

}