首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用didSelectRowAtIndexPath

使用didSelectRowAtIndexPath
EN

Stack Overflow用户
提问于 2015-03-01 18:01:37
回答 1查看 835关注 0票数 1

我有一个核心数据项目的主细节VC设置.如果searchBar是活动的,则显示一组结果,如果它不是活动的,则fetchedResultsController中的对象将显示在MasterVC中。

我一直在尝试使用prepareForSegue来完成任务,但是我的导师建议我使用didSelectRowAtIndexPath来完成这个任务。

代码语言:javascript
复制
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--它是在方法的顶部声明的!

如果我在"self"之前添加selectedNote,如下所示:

代码语言:javascript
复制
    detailViewController.detailDescriptionLabel = self.selectedNote.valueForKey("noteBody") as! UILabel

'MasterViewController' does not have a member named 'selectedNote'尽管在那里。所以很明显我搞砸了什么。

我在let detailViewController = DetailViewController()之前放置了一个断点,在lldb中,它打印出了正确的对象。我已经在这里找了个解决方案,但我现在还不够。我找不到适用于GitHub的代码。

代码语言:javascript
复制
class Note: NSManagedObject {

    @NSManaged var dateCreated: NSDate
    @NSManaged var dateEdited: NSDate
    @NSManaged var noteTitle: String
    @NSManaged var noteBody: String

}

任何想法如何将selectedNote的属性向前传递给detailViewController

更新:

根据我得到的响应,我用以下代码关闭了编译器警告:

代码语言:javascript
复制
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时,我单击的对象将显示在控制台中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-01 18:07:32

您需要声明selectedNote为可选的,如下所示:

代码语言:javascript
复制
  var selectedNote: Note?

然后在使用之前检查值是否存在。

代码语言:javascript
复制
  if let note = selectedNote {
    // Set up the detail view controller to show.
    let detailViewController = DetailViewController()
    detailViewController.detailDescriptionLabel = note.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)
  }

更新

问题是您正在尝试创建DetailViewController

代码语言:javascript
复制
let detailViewController = DetailViewController()

但是,您需要的是对DetailViewController的引用,以便将信息传递给它。

因此,您可以在接口构建器中创建从Master到Detail控制器的segue。然后从didSelectRowAtIndexPath中删除逻辑

代码语言:javascript
复制
 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    // Note: Should not be necessary but current iOS 8.0 bug requires it.
    tableView.deselectRowAtIndexPath(tableView.indexPathForSelectedRow()!, animated: false)
}

并在prepareForSegue方法中实现:

代码语言:javascript
复制
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "showDetail" {

        if let cell = sender as? UITableViewCell {

            let indexPath = tableView.indexPathForCell(cell)!

            var selectedNote: Note?

            if filteredObjects?.count > 0 {
                selectedNote = filteredObjects![indexPath.row]
            }else {
                selectedNote = self.fetchedResultsController.objectAtIndexPath(indexPath) as? Note // <--this is "everything"
            }

            if let note = selectedNote {

                let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
                controller.detailItem = note
            }
        }
    }
}

需要在IB中设置的showDetail - segue标识符。var detailItem: AnyObject?-您需要在DetailViewController中声明它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28797044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档