2016-07-27 2 views
1

Я работаю над одной частью моего приложения, которая будет функционировать как журнал для пользователя, в котором они могут добавить запись, а затем просмотреть или удалить их после этого. Я последовал за несколькими учебниками Swift для CoreData, и я подтвердил, что настройка CoreData работает. Однако у меня возникли проблемы с получением значений для UIViewController, которые будут отображать журнал после его сохранения. В одной конфигурации я попробовал, чтобы он не отображал никаких данных, в другом данные оставались бы такими же независимо от того, какая запись была выбрана, и в приведенной ниже настройке эта строка journalEntryViewer.journalViewerTextView.text = journalTextToPass возвращает «найденный номер при разворачивании необязательного значения». Вот код UITableViewController, который выступает в качестве списка:Передача ключей CoreData в новый ViewController

import UIKit 
import CoreData 

class JournalCollectionViewer: UITableViewController { 
    var JournalEntry = [NSManagedObject]() 
    var journalTextToPass:String! 
    var journalTitleToPass:String! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.tableView.reloadData() 
    } 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 
override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(true) 
    self.tableView.reloadData() 
    let appDelegate = 
     UIApplication.sharedApplication().delegate as! AppDelegate 
    let managedContext = appDelegate.managedObjectContext 
    let fetchRequest = NSFetchRequest(entityName: "JournalEntry") 
    do { 
     let results = 
      try managedContext.executeFetchRequest(fetchRequest) 

     JournalEntry = results as! [NSManagedObject] 
    } catch let error as NSError { 
     print("Could not fetch \(error), \(error.userInfo)") 
    } 
} 
// MARK: - Table view data source 

@IBOutlet weak internal var journalCollectionTable: UITableView! 


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return JournalEntry.count 
} 
override func tableView(tableView: UITableView, 
       cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = 
     tableView.dequeueReusableCellWithIdentifier("JournalCell") 

    let entry = JournalEntry[indexPath.row] 

    cell!.textLabel!.text = 
     entry.valueForKey("journalDate") as? String 
    return cell! 
} 
    func selectedTableCell(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let entry = self.JournalEntry[indexPath.row] 

    self.performSegueWithIdentifier("ShowEntryViewer", sender: entry) 
} 
// MARK: - Navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowEntryViewer" { 
     let journalEntryViewer = segue.destinationViewController as! JournalEntryViewer 
     journalEntryViewer.self.navigationItem.title = journalTitleToPass 
     journalEntryViewer.journalViewerTextView.text = journalTextToPass 
    } 
} 
} 

В Swift файл для просмотра (journalEntryViewer), все, что я сделал, объявляется класс и UITextView. Излишне говорить, что я в недоумении. Любая помощь ценится!

+0

Основные данные - это решение для сохранения объектов, поэтому в В большинстве случаев все, что вам нужно передать, это экземпляры NSManagedObject или даже лучшие экземпляры подкласса NSManagedObject. Создав модель Core Data, Xcode может сгенерировать эти подклассы для вас. – Paulw11

ответ

1

При присвоении значения для IBOutlet объекта в prepareForSegue метод, который раз не инициализируется, поэтому вам нужно передать объект строки и назначить этот объект строки в journalViewerTextView в viewDidLoad из JournalEntryViewer.

первого объявить два экземпляр вара в JournalEntryViewer как этот

var journalTitle: String? 
var journalText: String? 

Теперь использует эту вар в viewDidload

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.navigationItem.title = journalTitle 
    self.journalViewerTextView.text = journalTitle 
} 

Теперь передать это journalTitle и journalText в prepareForSegue методе JournalCollectionViewer

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowEntryViewer" { 
     let journalEntryViewer = segue.destinationViewController as! JournalEntryViewer 
     journalEntryViewer.journalTitle = journalTitleToPass 
     journalEntryViewer.journalText = journalTextToPass 
    } 
} 

New Edit:

Проблема с кода вы не использовали метод делегата didSelectRowAtIndexPath вместо вы используете что-то другое selectedTableCell, что неправильно попытка реализовать метод делегата от UITableView

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let entry = self.JournalEntry[indexPath.row] 
    self.performSegueWithIdentifier("ShowEntryViewer", sender: entry) 
} 

Теперь вам пропускают объект ввода, поэтому измените свой prepareForSegue следующим образом

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowEntryViewer" { 
     let journalEntryViewer = segue.destinationViewController as! JournalEntryViewer 
     let entry = sender as! NSManagedObject 
     journalEntryViewer.journalTitle = entry.valueForKey("journalDate") as? String 
     journalEntryViewer.journalText = entry.valueForKey("journalEntryText") as? String 
    } 
} 
+0

Это успешно захватывает информацию, но как только я выберу одну запись в журнале, она не изменится при выборе другой. Любые идеи, как это исправить? –

+0

Можете ли вы дать мне более подробную информацию о вашей проблеме? –

+0

Если я коснусь одной записи в журнале (скажем, что сказано «Привет»), заголовок и текст будут отображаться так же, как и в журнале JournalEntryViewer, но если я коснусь другого с разными данными, 'JournalEntryViewer 'все еще отображает один, который говорит «Привет». –

Смежные вопросы