2016-03-14 2 views
2

Я искал и до сих пор не могу понять, как это сделать:Swift CoreData: лучший подход для отображения конкретных данных?

У меня есть таблицаViewVC, которая показывает список (ячейки) данных, полученных из объекта CoreData: Person. В ячейке отображается только атрибут имени человека для каждого ввода данных.

Когда я нажимаю на ячейку (func didSelectRowAtIndexPath), она перейдет к detailViewVC, где я хочу показать значения остальных атрибутов, связанных с этими одиночными данными (например, возраст, пол, адрес и т. Д.).

Я изначально думал передать строковое значение имени с VC1 на VC2, а затем сделать какой-то цикл в VC2 для поиска соответствующих данных на основе атрибута name, но если имена повторяются в базе данных , это не сработает. Определенно глупо обходное решение, которое не сработает.

Итак, я собираюсь использовать уникальный идентификатор каждой записи данных, например ObjectID? Если да, то как это сделать? еще лучше и эффективнее?

Я новичок, поэтому, пожалуйста, будьте осторожны и терпеливы со мной. Благодаря!

EDIT:

VC1 имеет TableView:

import CoreData 

class vc1: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    ... ... ... 

    var personData = [Person]() 

    override func viewDidAppear(animated: Bool) { 
     fetchAndSetResults() 
     medTableView.reloadData() 
    } 

    func fetchAndSetResults() { 
     let app = UIApplication.sharedApplication().delegate as! AppDelegate 
     let context = app.managedObjectContext 
     let fetchRequest = NSFetchRequest(entityName: "Person") 

     do { 
      let results = try context.executeFetchRequest(fetchRequest) 
      self.personData = results as! [Person] 
     } 

     catch let err as NSError { 
      print(err.debugDescription) 
     } 
    } 


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     if let cell = tableView.dequeueReusableCellWithIdentifier("PersonCell") as? PersonCell { 

      let person = personData[indexPath.row] 

      cell.configureCell(person) //custom func that shows the string value of attribute "name" of entity "Person" on an IBOutlet label. 

      return cell 
     } 

     else { 
      return UITableViewCell() 
     } 
    } 
    ... ... 

    // Tapping a cell will present VC2_DetailView. 
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     let indexPath = tableView.indexPathForSelectedRow; 
     let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as! PersonCell 

     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     let vc = storyboard.instantiateViewControllerWithIdentifier("VC2_DetailView") as! VC2_DetailView 

     // Pass person's name in the tapped cell to the label.text in VC2_DetailView. 
     vc.receivedPersonName = currentCell.cellPersonName.text 

     //vc.view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.6) 
     //self.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext 

     // Adding dispatch_async to eliminate double tapping on cell. VC2 will be presented. 
     dispatch_async(dispatch_get_main_queue(), { 
      self.presentViewController(vc, animated: true, completion: nil) 
     }) 
    } 
    ... ... 

} 

С этим VC2 будет представлена, когда сливают клетка. Я хочу добиться того, что VC2 покажет другие атрибуты, связанные с именем этого конкретного человека, такие как «Возраст» и «Пол» объекта «Человек» и покажет их на соответствующей метке IBOutlet в VC2.

Дополнительная информация: Таблица VC1 имеет 3 ячейки: Джон, Дженни и Джош. Когда я нажму Дженни, VC2 представит, и ее возраст и пол будут показаны. Объект «Человек» имеет 3 атрибута: «имя», «возраст» и «пол».

Я новичок, поэтому любые подробные объяснения очень ценятся!

+0

Вы передумали проблему. Сущность содержит данные, которые вам нужны. Вам никогда не нужно ничего, как «Идентификатор объекта» или другой уникальный идентификатор. Просто используйте массив NSManagedObject, который будет содержать все, что вам нужно. Используйте силу, Люк. – RegularExpression

+0

Я не понимаю. Человек имеет данные о людях. например. Джон, Джеймс, Дженни и т. Д. Я хочу перейти к подробному представлению, в котором показаны только детали Дженни. Не могли бы вы уточнить, пожалуйста? –

+0

Проверьте этот пример кода, объяснив, как передать объект в detailViewController. https://developer.apple.com/library/ios/samplecode/CoreDataBooks/Introduction/Intro.html – dichen

ответ

3

Вы можете просто передать сущность непосредственно.

0

ОК, ребята, никто, казалось, не интересовался тем, что помогал мне глубже. Я как-то решить мою проблему таким образом:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    //let indexPath = tableView.indexPathForSelectedRow; 
    //let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as! PersonCell 

    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let vc = storyboard.instantiateViewControllerWithIdentifier("VC2_DetailView") as! VC2_DetailView 

    // Pass person's name in the tapped cell to the label.text in VC2_DetailView. 

    // Get all data stored in the coredata[indexpath] on the same tapped cell. 
    let person = personData[indextPath.row] 
    vc.receivedPersonName = person.name 
    vc.receivedPersonAge = person.age 
    vc.receivedPersonGender = person.sex 

    //vc.view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.6) 
    //self.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext 

    // Adding dispatch_async to eliminate double tapping on cell. VC2 will be presented. 
    dispatch_async(dispatch_get_main_queue(), { 
     self.presentViewController(vc, animated: true, completion: nil) 
    }) 
} 

В принципе, я восстановил все свойства конкретных данных и передал их VC2.

Следующим вызовом будет то, как редактировать эти данные и сохранять/обновлять существующие данные и не создавать новые или дублировать их.

Спасибо всем и счастливым кодированием!

+0

Я предложил просто передать объект person напрямую (так что vc.receivedPerson). Это позволяет избежать кодирования знаний о том, что показывает этот VC в представленном VC, - все, что он должен знать, - это то, что ему нужен человек, а не то, что он точно показывает этого человека. –

+0

Спасибо, Лу, ты прав. Но я сделал это более эффективным, отправив индекс. Таким образом, я могу позже реализовать функцию редактирования/обновления в VC2 для этих конкретных данных. –

+1

Это не более эффективно - это меньше. Передача объекта и передача индекса берут одно и то же время, но вам нужно переустановить объект, когда у вас есть только индекс. Кроме того, строка не является индексом, который постоянно связан с объектом. –

0

Ну, я на самом деле упростил мой код, чтобы показать детали объекта по определенному indexpath.row.

Когда клетка щелкнул:

// Let's try a new method by passing indexpath.row interger. 
    let index = indexPath.row 
    VC2.receivedIndex = index 

Поэтому VC2 получит порядковый номер повернутой ячейки от VC1.

Затем я реализовал fetchAndResults() объекта снова в VC2 и просто используя полученный индексный номер, я смог показать все детали этого конкретного объекта в соответствующих label.text (s).

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

Приветствия!

+0

Я бы этого не сделал. IndexPath.row - это то место, где объект сейчас находится в выборке прямо сейчас. Он не связан с объектом постоянно. Повторная выборка не является более эффективной (это намного меньше). Я все же предлагаю передать объект. Если вы должны передать идентификатор, используйте свойство objectID объекта - вы можете извлечь объект, используя его, - это больше работает, потому что вы могли просто передать объект. –