【发布时间】:2015-03-01 18:01:37
【问题描述】:
我有一个核心数据项目的主从 VC 设置。如果searchBar 处于活动状态,则显示一组结果,如果未处于活动状态,则 fetchedResultsController 中的对象将显示在 MasterVC 中。
我一直在尝试使用 prepareForSegue 进行转场,但我的导师建议我使用 didSelectRowAtIndexPath 进行转场。
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var selectedNote: Note
// Check to see which table view cell was selected.
if tableView == self.tableView {
selectedNote = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Note // <--this is "everything"
} else {
// need this to unwrap the optional
if let filteredObjects = filteredObjects {
selectedNote = filteredObjects[indexPath.row]
}
}
// Set up the detail view controller to show.
let detailViewController = DetailViewController()
detailViewController.detailDescriptionLabel = selectedNote.valueForKey("noteBody") as! UILabel
// Note: Should not be necessary but current iOS 8.0 bug requires it.
tableView.deselectRowAtIndexPath(tableView.indexPathForSelectedRow()!, animated: false)
// original code
navigationController?.pushViewController(detailViewController, animated: true)
}
我收到此编译器错误:
Variable 'selectedNote' used before being initialized--在方法顶部声明!
如果我像这样在selectedNote 之前添加"self":
detailViewController.detailDescriptionLabel = self.selectedNote.valueForKey("noteBody") as! UILabel
'MasterViewController' does not have a member named 'selectedNote' 尽管在那里。所以我显然在搞砸一些事情。
我在let detailViewController = DetailViewController() 和lldb 之前放置了一个断点,它打印出正确的对象。我在这里四处寻找解决方案,但我做不到。我在 GitHub 上找不到适用的代码。
class Note: NSManagedObject {
@NSManaged var dateCreated: NSDate
@NSManaged var dateEdited: NSDate
@NSManaged var noteTitle: String
@NSManaged var noteBody: String
}
任何想法如何将selectedNote 的属性转发给detailViewController?
更新:
根据我得到的回复,我已经用这段代码关闭了编译器警告:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var selectedNote: Note?
// Check to see which table view cell was selected.
if tableView == self.tableView {
selectedNote = self.fetchedResultsController.objectAtIndexPath(indexPath) as? Note // <--this is "everything"
} else {
// need this to unwrap the optional
if let filteredObjects = filteredObjects {
selectedNote = filteredObjects[indexPath.row]
}
}
// Set up the detail view controller to show.
let detailViewController = DetailViewController()
detailViewController.detailDescriptionLabel.text = (selectedNote!.valueForKey("noteBody") as! String)
// Note: Should not be necessary but current iOS 8.0 bug requires it.
tableView.deselectRowAtIndexPath(tableView.indexPathForSelectedRow()!, animated: false)
// original code
navigationController?.pushViewController(detailViewController, animated: true)
}
但是当它崩溃时,我在控制台中得到了这个:
There are already notes in the app
fatal error: unexpectedly found nil while unwrapping an Optional value
但是,当我键入 po selectedObject 时,我单击的对象会显示在控制台中。
【问题讨论】:
标签: ios swift core-data segue didselectrowatindexpath