Получить значение из определенной строки таблицы основных данных - затем сохранить значение в UserDefaults - PullRequest
0 голосов
/ 10 сентября 2018

Что я пытаюсь сделать в целом:
1. Создайте таблицу со всеми зарегистрированными пользователями (хранится в основных данных).
2. Затем разрешите пользователю выбрать зарегистрированного пользователя, нажав на строку.
3. Когда пользователь выбирает строку, открывается новая страница с подробной информацией о пользователе.

Я пытаюсь решить эту проблему:
1. Сначала сохраните имя пользователя из указанной ячейки в «UserDefaults.standard».
2. Затем на второй странице получите доступ к сохраненному имени пользователя из «UserDefaults.standard» и используйте это динамическое значение для извлечения базовых данных для получения более подробной информации о пользователе.

Проблемы:
Я уверен, что данные, которые передаются в «UserDefaults.standard», являются полной таблицей, а не данными из определенной ячейки. Я видел это с помощью «Print ()», на самом деле показать все строки, а не только одну строку, которая выбрана.
Таким образом, имя пользователя, которое затем генерируется на второй странице, представляет собой случайную строку, которая находится ниже (см. Рисунок).
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 голосов
/ 10 сентября 2018

Я решил эту проблему, задав «Sender:» точно такую ​​же строку, которая генерирует каждую ячейку в качестве имени пользователя. Теперь работает отлично!

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")

}
0 голосов
/ 10 сентября 2018

1 - Подключите источник segu к 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?

}
...