Как заставить Custom Cell обновлять метки к информации из основных данных - PullRequest
0 голосов
/ 26 апреля 2019

Я не получаю никаких ошибок, просто не результат, который я ищу. Здесь я собираю данные от пользователя (Если это не актуально, пожалуйста, дайте мне знать, чтобы я мог очистить пост)

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

class ViewController: UIViewController,UITableViewDataSource, UITableViewDelegate
{

    var parties: [NSManagedObject] = []

    @IBOutlet weak var tableView: UITableView!


    @IBAction func addParty(_ sender: UIBarButtonItem)
    {

        /*init alert controller with title, message & .alert style*/
        let alert = UIAlertController(title: "New Name",
                                      message: "Add a new name",
                                      preferredStyle: .alert)

        /*create a name text field, with placeholder "name"*/
        alert.addTextField(configurationHandler: { (textFieldName) in
            textFieldName.placeholder = "name"
        })

        /*create a ssn text field, with placeholder "ssn"*/
        alert.addTextField(configurationHandler: { (textFieldSize) in

            textFieldSize.placeholder = "size"
        })

        /*create a ssn text field, with placeholder "ssn"*/
        alert.addTextField(configurationHandler: { (textFieldContact) in

            textFieldContact.placeholder = "contact"
        })

        /*create a ssn text field, with placeholder "ssn"*/
        alert.addTextField(configurationHandler: { (textFieldLocation) in

            textFieldLocation.placeholder = "location"
        })

        /*create a save action*/
        let saveAction = UIAlertAction(title: "Save", style: .default) { [unowned self] action in

            /*find textfield's text (name) guard let way to get unwrap value otherwise return early*/
            guard let textField = alert.textFields?.first,
                let nameToSave = textField.text else {
                    return
            }
            /*find textfield's text (ssn) guard let way to get unwrap value  otherwise return early*/

            guard let textFieldSize = alert.textFields?[1],
                let sizeToSave = textFieldSize.text else {
                    return
            }

            /*find textfield's text (ssn) guard let way to get unwrap value  otherwise return early*/

            guard let textFieldContact = alert.textFields?[2],
                let contactToSave = textFieldContact.text else {
                    return
            }

            /*find textfield's text (ssn) guard let way to get unwrap value  otherwise return early*/

            guard let textFieldLocation = alert.textFields?[3],
                let locationToSave = textFieldLocation.text else {
                    return
            }

            /*call save method by passing nameToSave and SSNToSave*/
            self.save(name: nameToSave, size: sizeToSave, contact: contactToSave, location: locationToSave)
            self.tableView.reloadData()
        }

        let cancelAction = UIAlertAction(title: "Cancel",
                                         style: .default)

        alert.addAction(saveAction)
        alert.addAction(cancelAction)

        present(alert, animated: true)


    }

    //  Save core data function
    func save(name: String, size : String, contact: String, location: String)
    {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
        }


        /*1.
         Before you can save or retrieve anything from your Core Data store, you first need to get your hands on an NSManagedObjectContext. You can consider a managed object context as an in-memory “scratchpad” for working with managed objects.
         Think of saving a new managed object to Core Data as a two-step process: first, you insert a new managed object into a managed object context; then, after you’re happy with your shiny new managed object, you “commit” the changes in your managed object context to save it to disk.
         Xcode has already generated a managed object context as part of the new project’s template. Remember, this only happens if you check the Use Core Data checkbox at the beginning. This default managed object context lives as a property of the NSPersistentContainer in the application delegate. To access it, you first get a reference to the app delegate.
         */
        let managedContext = appDelegate.persistentContainer.viewContext

        /*
         An NSEntityDescription object is associated with a specific class instance
         Class
         NSEntityDescription
         A description of an entity in Core Data.

         Retrieving an Entity with a Given Name here person
         */
        let entity = NSEntityDescription.entity(forEntityName: "Party",
                                                in: managedContext)!


        /*
         Initializes a managed object and inserts it into the specified managed object context.

         init(entity: NSEntityDescription,
         insertInto context: NSManagedObjectContext?)
         */
        let party = NSManagedObject(entity: entity,
                                    insertInto: managedContext)

        /*
         With an NSManagedObject in hand, you set the name attribute using key-value coding. You must spell the KVC key (name in this case) exactly as it appears in your Data Model
         */
        party.setValue(name, forKeyPath: "name")
        party.setValue(size, forKeyPath: "size")
        party.setValue(contact, forKeyPath: "contact")
        party.setValue(location, forKeyPath: "location")

        /*
         You commit your changes to person and save to disk by calling save on the managed object context. Note save can throw an error, which is why you call it using the try keyword within a do-catch block. Finally, insert the new managed object into the people array so it shows up when the table view reloads.
         */
        do {
            try managedContext.save()
            parties.append(party)
            tableView.reloadData()
        } catch let error as NSError {
            print("Could not save. \(error), \(error.userInfo)")
        }
    }


    // TABLE VIEW CODE
    func tableView(_ tableView: UITableView,
                   numberOfRowsInSection section: Int) -> Int
    {
        return parties.count
    }


    //NEED TO FIX WHY CUSTOM CELL NOT DISPLAYING INFO
    func tableView(_ tableView: UITableView,
                   cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        (print(tableView.dequeueReusableCell(withIdentifier: "PartyCell", for: indexPath)))

        let party = parties[indexPath.row] as NSManagedObject
        let cell = tableView.dequeueReusableCell(withIdentifier: "PartyCell",
                                                 for: indexPath) as! PartyCell

        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
    }

    override func viewDidLoad()
    {
        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning()
    {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

...