Выбранная информация ячейки таблицы не отображается в подробном представлении с использованием основных данных, без ошибок - PullRequest
0 голосов
/ 26 апреля 2019

Когда ячейка таблицы выбрана, я хочу, чтобы она заполняла текстовые поля в моем подробном представлении после segue.

Вот один способ, который я нашел на этом сайте (я пробовал другие способы, которые я видел здесь, нобыли ошибки / проблемы при переводе кода для использования с основными данными и / или пользовательскими ячейками), который не возвращает ошибок, но не заполняет поля


    func tableView(_ tableView: UITableView,
                   cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        //(print(tableView.dequeueReusableCell(withIdentifier: "PartyCell", for: indexPath)))

        //  get selected row (party)
        let party = parties[indexPath.row] as NSManagedObject

        //  create custom cell
        let cell = tableView.dequeueReusableCell(withIdentifier: "PartyCell",
                                                 for: indexPath) as! PartyCell

        //  Update the custom cell labels with information from record
        cell.nameLabel?.text = party.value(forKeyPath: "name") as? String
        cell.sizeLabel.text = party.value(forKeyPath: "size") as? String
        cell.contactLabel.text = party.value(forKeyPath: "contact") as? String
        cell.locationLabel.text = party.value(forKeyPath: "location") as? String

        return cell
    }

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


        // Create a variable that you want to send based on the destination view controller
        // Get a reference to the data by using indexPath shown below
        let party = parties[indexPath.row]

        // Create an instance of DestinationViewController and pass the variable
        let destinationVC = DetailViewController()


        destinationVC.nameField.text = party.value(forKeyPath: "name") as? String
        destinationVC.sizeField.text = party.value(forKeyPath: "size") as? String
        destinationVC.contactField.text = party.value(forKeyPath: "contact") as? String
        destinationVC.locationField.text = party.value(forKeyPath: "name") as? String


        // Let's assume that the segue name is called playerSegue
        // This will perform the segue and pre-load the variable for you to use
        destinationVC.performSegue(withIdentifier: "mySegue", sender: self)

    }

А вот подробный вид с выходными соединениямиустановлено

import Foundation
import UIKit
import CoreData

class DetailViewController: UIViewController
{

    //let party = NSEntityDescription.insertNewObjectForEntityForName("Party", inManagedObjectContext: managedObjectContext) as! Party


    @IBOutlet weak var nameField: UITextField!
    @IBOutlet weak var sizeField: UITextField!
    @IBOutlet weak var contactField: UITextField!
    @IBOutlet weak var locationField: UITextField!

    override func viewWillAppear(_ animated: Bool)
    {

    }

}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Три фатальные ошибки:

  1. DetailViewController() не является экземпляром в раскадровке.
  2. Даже если это были розетки, еще не подключенные сразу после инициализации контроллера.
  3. Вы должны выполнить переход на контроллере основного вида, а не на DetailViewController.

Решения:

  1. In didSelectRowAt вызовите self.performSegue и передайте управляемый объект как sender

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
        performSegue(withIdentifier: "mySegue", sender: parties[indexPath.row])
    }
    
  2. В DetailViewController объявите свойство NSManagedObject.

    class DetailViewController: UIViewController
    {
    
        var party : NSManagedObject!
    
        ...
    
  3. Реализация prepare(for segue и присвоение объекта NSManagedObject временному свойству.

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard segue.identifier == "mySegue" else { return }
        let detailViewController = segue.destination as! DetailViewController
        detailViewController.party = sender as! NSManagedObject
    }
    
  4. В viewDidLoadиз DetailViewController назначить свойства для торговых точек.

    override func viewDidLoad()
    {
       super.viewDidLoad()
       nameField.text = party.value(forKey: "name") as? String
       sizeField.text = party.value(forKey: "size") as? String
       contactField.text = party.value(forKey: "contact") as? String
       locationField.text = party.value(forKey: "location") as? String
    }
    
0 голосов
/ 26 апреля 2019

Вы можете просто добавить переменную в свой контроллер detailview:

class DetailViewController: UIViewController { 
    var party: Party!
}

использование segue для передачи выбранной партии; так что в didSelectRowAt

let destinationVC = UIStoryboard(name: "yourStory", bundle: nil).instantiateViewController(withIdentifier: "yourId") as! DetailViewController()
destinationVC.party = selectedParty
destinationVC.performSegue(withIdentifier: "mySegue", sender: self)

затем в ваших viewDidLoad ваших DetailViewController настройках ваших торговых точек:

override func viewDidLoad() {
   super.viewDidLoad()
   nameField.text = party.something
//and so on!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...