从特定核心数据表行中检索值-然后将值存储到UserDefaults

时间:2018-09-10 12:12:27

标签: swift core-data nsuserdefaults didselectrowatindexpath

我通常要做什么:
1.生成一个包含所有注册用户的表(存储在核心数据中)。
2.然后,允许用户通过按一行来选择注册用户。
3.当用户选择一行时,将打开一个新页面,其中包含详细的用户信息。

我正在尝试通过以下方式解决此问题:
1.首先将给定单元格中的用户名存储到“ UserDefaults.standard”中。
2.然后在第二页上,从“ UserDefaults.standard”访问存储的UserName,并使用该动态值检索Core Data以获取更详细的用户信息。

问题:
我确定传递到“ UserDefaults.standard”的数据是完整表,而不是来自特定单元格的数据。我已经通过使用“ Print()”看到了这一点,实际上是显示了所有行,而不是仅显示了选定的一行。
因此,然后生成到第二页的UserName是一个随机行,该行进一步向下(参见图片)。
enter image description here



    public class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

 var userNameobject : [NSManagedObject] = []

    @IBAction func pushTwo(_ sender: Any) {
    }

    @IBOutlet weak var usersList: UITableView!

    override public func viewDidLoad() {
        super.viewDidLoad()

        usersList.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    }

    public override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return }

        let managedContext = appDelegate.persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Users")

        do {
                userNameobject = try managedContext.fetch(fetchRequest)

                                            } catch let error as NSError {
                                                print("Could not fetch. \(error), \(error.userInfo)")
                                            }
    }

      public func tableView(_ usersList: UITableView, numberOfRowsInSection section: Int) -> Int {
        return userNameobject.count

    }

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

            let person = userNameobject[indexPath.row]
            let cell = usersList.dequeueReusableCell(withIdentifier: "CellTwo", for: indexPath) as UITableViewCell
                cell.textLabel?.text = person.value(forKeyPath: "userName") as? String

            // STORE USERNAME
            let defaults = UserDefaults.standard
            defaults.set(person.value(forKeyPath: "userName"), forKey: "userNameDefault")

            return cell

    }
}

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

    }

2 个答案:

答案 0 :(得分:0)

1-将segue源连接到VC,而不是连接到单元格

func tableView(_ userList: UITableView, didSelectRowAt indexPath: IndexPath)
{ 
   self.performSegue(withIdentifier: "toSecond", sender:userNameobject[indexPath.row])
}

2-实作

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

    if let des = segue.destination as? SecondVC {
         des.person = sender as! NSManagedObject
    }

}

3-

class SecondVC:UIViewController {

    var person: NSManagedObject?

}

答案 1 :(得分:-2)

我通过给“发件人:”一个完全相同的行来解决此问题,该行将生成每个给定单元的用户名。现在可以正常使用了!

public func tableView(_ userList: UITableView, didSelectRowAt indexPath: IndexPath)
{
    let person = userNameobject[indexPath.row]
    let two =  person.value(forKeyPath: "userName") as? String
    self.performSegue(withIdentifier: "userLinkSegue", sender: two!)

    print(two!)

     // STORE USERNAME
     let defaults = UserDefaults.standard
     defaults.set(two!, forKey: "userNameDefault")

}