【问题标题】:Delegate method, textViewDidChangeSelection not triggered everytime委托方法,textViewDidChangeSelection 不是每次都触发
【发布时间】:2021-06-05 17:49:17
【问题描述】:

我在 UITableView 单元格中嵌入了一个 UITextView,CustomCell。如果我在光标位于文本末尾时点击返回键,我想在该单元格下方创建一个新单元格,但是如果我在 textView 中间点击返回,我想获得其余的光标后的单词并在 textView 中创建一个包含该文本的单元格。 为此,我需要知道我在 UITextViewDelegate 方法 textViewDidChangeSelection(_:) 的帮助下获得的 textView 中光标的位置。

它仅在我点击同一单元格上的不同位置时才有效,但如果我移动到不同的单元格并再次点击之前点击过的单元格(在文本视图中)在同一位置,委托方法不会被触发.

让我用一个例子来展示这个案例-

我输入了一些文本进行测试。在这里,在第 5 行之后,我决定在 "juice" 一词之前点击第 2 行,例如 -

委托方法textViewDidChangeSelection(_:) 被触发。

现在,我点击整个文本“Skim Milk”之后的第 3 行,就像-

再次调用委托方法textViewDidChangeSelection(_:)

但是现在当我回到第二行的相同位置时,即在“果汁”一词之前,委托方法不会被触发。再次,如果我在“牛奶”一词之后的相同位置点击第 3 行,则不会调用委托方法。

我想,原因是在那些单元格中,我点击了正常的位置,并且由于选择没有改变,委托方法没有被调用。 以下是 CustomCell(UITableViewCell) 类中的委托方法的代码-

 func textViewDidChangeSelection(_ textView: UITextView){
        if let range = textView.selectedTextRange, let indexPath = currentIndexPath{
            let curserStartPosition = textView.offset(from: textView.beginningOfDocument, to: range.start)
            setActiveCell?(indexPath, curserStartPosition)
        }
    }

以下是控制器的代码,其中点击返回键时会创建新的单元格-

class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
     var cellCount  = 1
     var initialCellText: String?
     var activeCell: CustomCell?
     var cursorPosition: Int?

    @IBOutlet weak var myTableView: UITableView!{
        didSet{
            myTableView.delegate = self
            myTableView.dataSource = self
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()  
    }
    
    func goToNextCell(_ indexPath:IndexPath){

        let nextCelIndexPath = IndexPath(row: indexPath.row + 1, section: 0)      
        if let text = activeCell?.myTextView.text, let cursorPos = cursorPosition, cursorPos < text.count-1 {
            let fromIndex = text.index(text.startIndex, offsetBy: cursorPos)
            let toIndex = text.index(text.endIndex, offsetBy: -1)
        
        if fromIndex < toIndex {
            let truncatedText = text[fromIndex...toIndex]
            self.initialCellText = String(truncatedText)
        }
    }
    cellCount += 1
    myTableView.beginUpdates()
    myTableView.insertRows(at: [nextCelIndexPath], with: .none)
    myTableView.endUpdates()

    initialCellText = nil
    cursorPosition = nil
    
    if let cell = self.myTableView.cellForRow(at: nextCelIndexPath) as? CustomCell{
        self.activeCell = cell
        self.activeCell?.myTextView.becomeFirstResponder()
    }
}
    func setActiveCell(on indexPath: IndexPath, at curserPos: Int){
        if let tappedOnCell = myTableView.cellForRow(at: indexPath) as? CustomCell{
            self.activeCell = tappedOnCell
            self.cursorPosition = curserPos
        }
    }   
}
// MARK: - UITableViewDelegate and UITableViewDataSource

extension MyViewController{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cellCount
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "customCell") as? CustomCell{
            cell.myTextField.becomeFirstResponder()
            cell.returnKeyTapped = goToNextCell(_:)
            cell.setActiveCell = setActiveCell(on:at:)
            return cell
        }
        return UITableViewCell()
    }
}

要创建以下单元格,我需要每次都知道光标在特定单元格上的位置。所以,我需要每次都触发委托方法。

任何人都可以对我如何解决我的问题提出任何建议。

【问题讨论】:

    标签: swift uitextviewdelegate uitextinput


    【解决方案1】:

    如果我没听错的话,你基本上是想在输入UITextView 后知道光标的位置。
    现在,如果您输入UITextView,该文本视图将成为第一响应者,并开始编辑会话。这是由UITextView.textDidBeginEditingNotification 宣布的,您可以为其添加观察者,请参阅here
    在通知调用的函数中,您可以像在textViewDidChangeSelection中一样计算光标位置

    【讨论】:

    • 感谢您的建议。但是,实现 textViewDidBeginEditing 来计算光标也有问题。只有当我点击 textView 时才会触发一次。如果我更改文本,它不会被触发。因此,对于这种情况, textViewDidChangeSelection 方法让我获得了位置。因此,我不得不添加 textViewDidBeginEditing 方法,而不是替换。
    猜你喜欢
    • 2017-05-17
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多