【发布时间】:2015-09-22 04:42:52
【问题描述】:
当使用 SplitViewController 时,通过我的 DetailViewController 中的 IBOutlet 连接的图像为零。
我正在使用协议在 MasterViewController 和 DetailViewController 之间进行通信
protocol EventSelectedDelegate: class {
func eventSelected(event: Event)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "eventDetailsSegue" {
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
let selectedIndex = self.eventTableView!.indexPathForCell(sender as! UITableViewCell)
let event = self.events[selectedIndex!.row]
self.delegate = controller
self.delegate?.eventSelected(event)
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
controller.navigationItem.leftItemsSupplementBackButton = true
}
}
并在DetailViewController中实现方法
class DetailViewController: UIViewController, EventSelectedDelegate {
private var event : Event?
@IBOutlet weak var eventImage: UIImageView!
func eventSelected(event: Event) {
self.event = event
self.configure()
}
func configure() {
if let event = self.event {
self.title = event.name
if let eventImage = self.eventImage {
eventImage.image = event.image // <--- Never reached.
}
}
}
}
示例 SplitViewController 工作正常,其中 UILabel 通过 IBOutlet 连接。
示例代码和我的代码之间的唯一区别是,我在我的 AppDelegate.swift 文件中加载的 UISplitViewController 部分有一个单独的故事板
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let storyboard = UIStoryboard(name: "MyBundle", bundle: NSBundle(identifier: "com.example.MyBundle"))
self.window?.rootViewController = storyboard.instantiateInitialViewController()
self.window?.makeKeyAndVisible()
return true
}
我正在使用 XCode 7 和 Swift 2。有人有什么想法吗?
【问题讨论】:
-
查看展开可选的行:如果让 eventImage = self.eventImage,我有一个问题。在尝试解包之前,您是否分配了委托的 eventImage 属性??
-
我将添加更多的类,试图用 sn-ps 保持代码简短。 eventImage 在 DetailViewController 类中定义。
-
当然谢谢。你确定 self.eventImage 不是 nil 吗?您是否尝试在控制台中将其注销?我相信展开会导致零。这就是为什么控件永远不会到达“if”块中的代码。
-
我已经步入configure函数,self.eventImage确实是nil。我只在它崩溃后添加了展开。
-
是的 @Jeremy self.eventImage 将为零,因为它之前没有初始化。并且您已将解包添加到之前未初始化的属性中,因此它将始终为 nil 并且不会进入 if 块。看看下面的答案。希望这会有所帮助:)