带DetailViewController的SIGABRT信号

时间:2015-06-15 00:29:33

标签: ios swift

我是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)。

2 个答案:

答案 0 :(得分:1)

替换它:

let detailViewController = segue.destinationViewController as! DetailViewController

有了这个:

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

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

答案 1 :(得分:0)

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

你想要的是:

if let detailViewController = segue.destinationViewController as? DetailViewController {

但是@nhgrif有一个观点:你对导航控制器很感兴趣。