当移动到嵌入在 UITableViewCell 中的 UITextView 中的新行时,光标消失

Posted

技术标签:

【中文标题】当移动到嵌入在 UITableViewCell 中的 UITextView 中的新行时,光标消失【英文标题】:Cursor Disappearing When moving to new line in UITextView embedded in UITableViewCell 【发布时间】:2018-06-01 16:13:13 【问题描述】:

我在 UITableViewCell 中嵌入了一个 UITextView。

在 UITextView 更新时调用 reloadTableView() 实现 UITableViewCell 在 UITextView 变得太大或太小时自动调整大小。

问题是当通过创建一个对上一行来说太大的单词或按回车来移动到一个全新的行时,光标不会立即出现。相反,光标将消失,并且应该在新行上的字符或单词在添加其他字符之前无法看到,此时它应该出现。您可以在 giphy 上的 gif 链接中看到问题: gif image of problem

值得注意的是,这只发生在 UITextView 的最底部。如果现有的两个段落正常出现,而我决定在现有两个段落之间输入一个段落,则不会出现光标消失的问题。

我已经包含了下面的代码,但我不知道是什么导致了这个问题。

import Foundation

import UIKit

import CoreData


class textViewTableViewCell: UITableViewCell, UITextViewDelegate 



//https://***.com/questions/15711645/how-to-get-uitableview-from-uitableviewcell



var tableView: UITableView? 

    var view = self.superview

    while (view != nil && view!.isKind(of: UITableView.self) == false) 

        view = view!.superview

    

    return view as? UITableView







public var cellText: String = ""

var peopleArray: [NSManagedObject] = []



@IBOutlet weak var textView: UITextView!



override func layoutSubviews() 



    textView.delegate = self

    //textView.text = cellText







func textViewDidChange(_ textView: UITextView) 



    save()











func save() 

    let offset = textView.contentOffset

    guard let appDelegate =

        UIApplication.shared.delegate as? AppDelegate else 

            return

    



    // 1

    let managedContext =

        appDelegate.persistentContainer.viewContext



    // 2

    let entity =

        NSEntityDescription.entity(forEntityName: "Person",

                                   in: managedContext)!



    let person = NSManagedObject(entity: entity,

                                 insertInto: managedContext)



    //2.5

    let predicate = NSPredicate(format: "name == %@", cellText)



    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")

    fetchRequest.predicate = predicate



    do 

        let fetchedEntities = try managedContext.fetch(fetchRequest) as! [Person]

        fetchedEntities.first?.name = textView.text

        cellText = textView.text



     catch 

        // Do something in response to error condition

    



    do 



        try managedContext.save()

        tableView?.beginUpdates()

        tableView?.endUpdates()

     catch 

        // Do something in response to error condition

    











class JournalEntryDetailViewController:  UITableViewController, UITextViewDelegate   

public var hasViewAppeared: Bool = false

public var text: String = ""

var people: [NSManagedObject] = []



//@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() 





    tableView.estimatedRowHeight = 500

    tableView.rowHeight = UITableViewAutomaticDimension



    super.viewDidLoad()











override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 



    return UITableViewAutomaticDimension









override func viewWillAppear(_ animated: Bool) 



   //when the journal entry view is about to appear, we do not want the ios 10 added large titles

    //https://chariotsolutions.com/blog/post/large-titles-ios-11/

    self.navigationController?.navigationBar.prefersLargeTitles = false











override func viewDidAppear(_ animated: Bool) 



    hasViewAppeared = true

    tableView.reloadData()

    //tableView.beginUpdates()

    //tableView.endUpdates()







override func prepare(for segue: UIStoryboardSegue, sender: Any?)



    if segue.destination is ViewController

    

        let vc = segue.destination as? ViewController



        vc?.removeBlanks()

        vc?.tableView.reloadData()

    





override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return 1





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

    let cell: textViewTableViewCell = tableView.dequeueReusableCell(withIdentifier: "textCell",

                                                                         for: indexPath) as! textViewTableViewCell

    cell.cellText = text

    cell.textView.text = text

    cell.peopleArray = people        

    return cell


【问题讨论】:

【参考方案1】:

修复了错误,但不是最令人满意的解决方案。不知为何

tableView?.beginUpdates()
tableView?.endUpdates()

需要运行两次。

tableView?.beginUpdates()
tableView?.endUpdates()
tableView?.beginUpdates()
tableView?.endUpdates()

不知道为什么?第一个周期更新只更新 UITableViewCell 高度,然后第二个周期更新 UITextView。奇怪...如果有人能解释为什么我会接受他们的回答。

【讨论】:

以上是关于当移动到嵌入在 UITableViewCell 中的 UITextView 中的新行时,光标消失的主要内容,如果未能解决你的问题,请参考以下文章

将 UIView 移动到新的超级视图并从 UITableViewCell 再次返回

UITableViewCell 具有嵌入式垂直堆栈视图设置,具有自动布局和动态高度

在 UITableViewCell 中嵌入 MPMoviePlayerController

在另一个自定义 UIView 中嵌入自定义 UITableViewCell?

寻找有关如何在 UITableViewCell 中嵌入 UITextField 的示例

重新排序/移动 UITableViewCell 但向后移动