带有 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 是在情节提要上创建的,它应该自动具有目标控制器。
您是否阅读了错误信息? destinationViewController
是 UINavigationController
。您的答案仍然尝试将其转换为其他内容。演员表会失败。以上是关于带有 DetailViewController 的 SIGABRT 信号 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
显示 DetailViewController 时在哪里为 KVO 添加和删除观察者
为啥 DetailViewController 使用 Tabbar 和 Navigation Controller 弹出到第一个 DetailViewController?