如何获取自定义单元以将标签更新为核心数据中的信息

时间:2019-04-25 23:23:41

标签: swift core-data tableview

我没有任何错误,只是没有得到我想要的结果。 这是我从用户那里收集数据的地方 (如果这不相关,请告诉我,以便整理帖子)

我希望我的自定义单元格在添加核心数据记录后显示它,但它一直显示占位符标签而不是更新。

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.
    }


}

0 个答案:

没有答案