При переносе текста из ячейки на метку в следующем VC он не появляется при первом открытии VC - PullRequest
0 голосов
/ 01 ноября 2019

Я создаю приложение, в котором вы создаете воспоминания в табличном представлении, и вы нажимаете на ячейку, и она переносит вас в назначенный для нее VC. Я пытаюсь сделать так, чтобы при нажатии ячейки текст внутри этой таблицыячейка берется в метку в следующем ВК. Это работает, но проблема в том, что при первом открытии представления текст не появляется внутри метки, даже если консоль сообщает, что текст загружен правильно:

TableView с тестовой ячейкойв нем.

Первый раз, когда открывается ВК для ячейки

Консоль, сообщающая, что текст передан и загружен правильно

Второй раз, когда открывается ВК.

Вот мой код передачи и загрузки для контроллеров ViewController:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {

var selectedRow : Int = 0 + 1 

var selectedNameVC : String?

var favourites: [NSManagedObject] = []

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

              //MARK:- New CoreData methods
        let favMemory = favourites[indexPath.row]
              cell.textLabel?.text = favMemory.value(forKeyPath: "name") as? String

        if #available(iOS 13.0, *) {
            cell.backgroundColor = UIColor.secondarySystemGroupedBackground
        } else {
            // Fallback on earlier versions
        }
              return cell
   }

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        selectedRow = indexPath.row


        let cell = tableView.cellForRow(at: indexPath)

        let favMemory = cell?.textLabel?.text
        selectedNameVC = favMemory
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? FavouritesViewController {
            destination.row = selectedRow
            destination.selectedName = selectedNameVC


        }
    }

class FavouritesViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, UITextViewDelegate {

var selectedName: String?

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)

        labelText.text = selectedName

        if labelText.text == "" as String? {
            print("Title has not loaded correctly.")
        } else {
            print("Title has loaded correctly.")
        }
}

1 Ответ

0 голосов
/ 01 ноября 2019

Во-первых, вы не должны получать значения из ячеек ... получать их из своего источника данных (это то, что вы использовали для установки значений).

Итак, в didSelectRowAt вместо:

    let cell = tableView.cellForRow(at: indexPath)

    let favMemory = cell?.textLabel?.text

вы должны сделать:

    let favMemory = favourites[indexPath.row]

Однако это не то, что вызывает вашу проблему.

I 'Если предположить, что в вашей раскадровке у вас есть «Show Segue», подключенный из вашей прототипной ячейки к вашей FavouritesViewController. Если это так, prepare(for segue: ...) называется до didSelectRowAt. Чтобы подтвердить это, измените код на:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    tableView.deselectRow(at: indexPath, animated: true)
    selectedRow = indexPath.row

    // don't do this        
    //let cell = tableView.cellForRow(at: indexPath)
    //let favMemory = cell?.textLabel?.text

    let favMemory = favourites[indexPath.row]

    print("In didSelectRowAt --- Setting var selectedNameVC = favMemory: \(favMemory)")

    selectedNameVC = favMemory

}

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

    if let destination = segue.destination as? FavouritesViewController {

        print("In prepareForSegue --- Setting selectedName in FavouritesViewController = selectedNameVC: \(selectedNameVC)")

        destination.row = selectedRow
        destination.selectedName = selectedNameVC
    }

}

Вот что вы должны увидеть в консоли отладки:

In prepareForSegue --- Setting selectedName in FavouritesViewController = selectedNameVC: nil
In didSelectRowAt --- Setting var selectedNameVC = favMemory: Test
Title has loaded correctly.

Как видите, prepareForSegue запускается первым, поэтомузначение selectedNameVC равно nil (оно еще не установлено).

Чтобы исправить это, вы можете установить переменные в willSelectRowAt вместо in didSelectRowAt:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {

    selectedRow = indexPath.row
    let favMemory = favourites[indexPath.row]
    selectedNameVC = favMemory

    return indexPath

}

Либо создайте свой Segue в раскадровке, но not подключите его к ячейке. Вместо этого дайте ему Идентификатор (например, «ShowFavourites»), и в didSelectRowAt установите ваши переменные и позвоните performSegue:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    tableView.deselectRow(at: indexPath, animated: true)
    selectedRow = indexPath.row
    let favMemory = favourites[indexPath.row]
    selectedNameVC = favMemory
    performSegue(withIdentifier: "ShowFavourites", sender: nil)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...