委托方法,textViewDidChangeSelection 不是每次都触发
Delegate method, textViewDidChangeSelection not triggered everytime
我在 UITableView 单元格中嵌入了一个 UITextView,CustomCell
。如果我在光标位于文本末尾时点击 return 键,我想在该单元格下方创建一个新单元格,但是如果我在 textView 中间时点击 return ,我想获取光标后的其余单词,并在 textView 中创建一个包含该文本的单元格。
为此,我需要知道我在 UITextViewDelegate
方法 textViewDidChangeSelection(_:)
.
的帮助下获得的 textView 中的光标位置
它仅在我点击同一单元格的不同位置时有效,但如果我移动到不同的单元格并在同一位置再次点击先前点击的单元格(在文本视图中),则委托方法不起作用被触发。
让我举个例子-
我输入了一些文本进行测试。在这里,在第 5 行之后,我决定在第 2 行的“果汁”一词之前点击 -
委托方法,textViewDidChangeSelection(_:)
被触发。
现在,我点击整个文本“脱脂牛奶”后的第 3 行,就像-
再次调用委托方法 textViewDidChangeSelection(_:)
。
但是现在当我回到第二行的相同位置时,意思是在“juice”这个词之前,委托方法没有被触发。同样,如果我在“牛奶”一词之后的相同位置点击第 3 行,则不会调用委托方法。
我想,原因是在那些单元格中,我点击了正常的位置,由于选择没有改变,委托方法没有被调用。
以下是 CustomCell
(UITableViewCell) class-
中委托方法的代码
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)
}
}
以下是控制器的代码,当点击 return 键时会创建新的单元格-
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()
}
}
要创建以下单元格,我需要每次都知道光标位置在特定单元格上的位置。所以,我需要每次都触发委托方法。
任何人都可以就如何解决我的问题提出任何建议。
如果我没理解错的话,您基本上是想在输入 UITextView
.
后知道光标位置
现在,如果您输入 UITextView
,该文本视图将成为第一响应者,并开始编辑会话。这是由 UITextView.textDidBeginEditingNotification
宣布的,您可以为其添加观察者,请参阅 here。
在通知调用的函数中,您可以像在 textViewDidChangeSelection
中那样计算光标位置
我在 UITableView 单元格中嵌入了一个 UITextView,CustomCell
。如果我在光标位于文本末尾时点击 return 键,我想在该单元格下方创建一个新单元格,但是如果我在 textView 中间时点击 return ,我想获取光标后的其余单词,并在 textView 中创建一个包含该文本的单元格。
为此,我需要知道我在 UITextViewDelegate
方法 textViewDidChangeSelection(_:)
.
它仅在我点击同一单元格的不同位置时有效,但如果我移动到不同的单元格并在同一位置再次点击先前点击的单元格(在文本视图中),则委托方法不起作用被触发。
让我举个例子-
我输入了一些文本进行测试。在这里,在第 5 行之后,我决定在第 2 行的“果汁”一词之前点击 -
委托方法,textViewDidChangeSelection(_:)
被触发。
现在,我点击整个文本“脱脂牛奶”后的第 3 行,就像-
再次调用委托方法 textViewDidChangeSelection(_:)
。
但是现在当我回到第二行的相同位置时,意思是在“juice”这个词之前,委托方法没有被触发。同样,如果我在“牛奶”一词之后的相同位置点击第 3 行,则不会调用委托方法。
我想,原因是在那些单元格中,我点击了正常的位置,由于选择没有改变,委托方法没有被调用。
以下是 CustomCell
(UITableViewCell) class-
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)
}
}
以下是控制器的代码,当点击 return 键时会创建新的单元格-
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()
}
}
要创建以下单元格,我需要每次都知道光标位置在特定单元格上的位置。所以,我需要每次都触发委托方法。
任何人都可以就如何解决我的问题提出任何建议。
如果我没理解错的话,您基本上是想在输入 UITextView
.
后知道光标位置
现在,如果您输入 UITextView
,该文本视图将成为第一响应者,并开始编辑会话。这是由 UITextView.textDidBeginEditingNotification
宣布的,您可以为其添加观察者,请参阅 here。
在通知调用的函数中,您可以像在 textViewDidChangeSelection