带有 DetailViewController 的 SIGABRT 信号 [重复]

Posted

技术标签:

【中文标题】带有 DetailViewController 的 SIGABRT 信号 [重复]【英文标题】:SIGABRT signal with DetailViewController [duplicate] 【发布时间】:2015-06-15 00:29:33 【问题描述】:

我对 Swift 非常陌生,并且仍在研究 Swift/Objective-C 语法和库。我正在尝试重新创建一个简单的图片列表,我可以在不同的图像视图上查看。以下是代码和错误消息,有人可以指导我正确的方向。

导入 UIKit

class MasterViewController: UITableViewController 

    var detailViewController: DetailViewController? = nil
    var objects = [AnyObject]()


    override func awakeFromNib() 
        super.awakeFromNib()
        if UIDevice.currentDevice().userInterfaceIdiom == .Pad 
            self.clearsSelectionOnViewWillAppear = false
            self.preferredContentSize = CGSize(width: 320.0, height: 600.0)
        
    

    override func viewDidLoad() 
        super.viewDidLoad()

        let fm = NSFileManager.defaultManager()
        let path = NSBundle.mainBundle().resourcePath!

        let items = fm.contentsOfDirectoryAtPath(path, error: nil)

        for item in items as! [String] 
            if item.hasPrefix("IMG_") 
                objects.append(item)
            
        

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    // MARK: - Segues

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "showDetail" 
            if let indexPath = self.tableView.indexPathForSelectedRow() 

                let detailViewController = segue.destinationViewController as! DetailViewController
                detailViewController.detailItem = objects[indexPath.row] as? String
            
        
    

    // MARK: - Table View

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return objects.count
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

        let object: (AnyObject) = objects[indexPath.row]
        cell.textLabel!.text = object as? String
        return cell
    


我在这段代码中得到了错误:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "showDetail" 
            if let indexPath = self.tableView.indexPathForSelectedRow() 

                let detailViewController = segue.destinationViewController as! DetailViewController
                detailViewController.detailItem = objects[indexPath.row] as? String
            
        
    

控制台中的错误信息如下:

无法将“UINavigationController”(0x10a979698)类型的值转换为“Project1.DetailViewController”(0x1090f27a0)。

【问题讨论】:

你能分享它失败的那一行吗? 失败的行是 let detailViewController = segue.destinationViewController as! DetailViewController 这与Objective-C无关。请不要滥用标签,尤其是语言标签,因为这会影响文章中的语法高亮。 【参考方案1】:

替换这个:

let detailViewController = segue.destinationViewController as! DetailViewController

有了这个:

let nav = segue.destinationViewController as UINavigationController
let detailViewController = nav.topViewController as! DetailViewController

解决方案修改自:DestinationViewController Segue and UINavigationController swift

【讨论】:

与其复制别人的答案,这里的适当操作是将问题标记为重复。【参考方案2】:

是什么让您认为 sender 是目标视图控制器?不是。

你想要的是:

if let detailViewController = segue.destinationViewController as? DetailViewController 

但是@nhgrif 有一点:您正在使用导航控制器。

【讨论】:

这会阻止崩溃,但仍不能提供所需的结果。 detailViewController 将是 nil 而这个 if 不会进入。 为什么它会为零?您无缘无故地投票给人们,也没有提供任何细节。完美。 如果 segue 是在情节提要上创建的,它应该自动具有目标控制器。 您是否阅读了错误信息? destinationViewControllerUINavigationController。您的答案仍然尝试将其转换为其他内容。演员表会失败。

以上是关于带有 DetailViewController 的 SIGABRT 信号 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

显示 DetailViewController 时在哪里为 KVO 添加和删除观察者

“加入收藏”功能

为啥 DetailViewController 使用 Tabbar 和 Navigation Controller 弹出到第一个 DetailViewController?

如何更新 Core Data 的用户界面?

带有 TabbarController 的 SplitViewController

更新 UISplitViewController 子类中 DetailViewController 的框架