Исчезновение курсора при переходе на новую строку в UITextView, встроенном в UITableViewCell - PullRequest
0 голосов
/ 01 июня 2018

У меня есть UITextView, встроенный в UITableViewCell.

storyboard

Вызов reloadTableView () при обновлении UITextView достигает UITableViewCell, автоматически изменяющего размер, когдаUITextView становится слишком большим или слишком маленьким.

Проблема в том, что при переходе на новую строку путем создания слова, слишком большого для предыдущей строки или нажатия клавиши возврата, курсор не появится сразу.Вместо этого курсор исчезнет, ​​и символ или слово, которые должны быть в новой строке, не будут видны до тех пор, пока не будет добавлен дополнительный символ, и в этот момент он выглядит так, как должен.Вы можете увидеть проблему в gif-ссылке на giphy: gif изображение проблемы

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

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

import Foundation

import UIKit

import CoreData


class textViewTableViewCell: UITableViewCell, UITextViewDelegate {



//https://stackoverflow.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 Ответ

0 голосов
/ 01 июня 2018

Исправлена ​​ошибка, но не самое удачное решение.По какой-то причине

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

нужно запустить дважды.

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

Не знаете почему?Первый цикл обновлений только обновляет высоту UITableViewCell, а затем второй цикл обновляет UITextView.Странно ... Если кто-то может объяснить, почему я приму их ответ.

...