【问题标题】:IBOutlet nil in DetailViewController of a SplitViewControllerSplitViewController 的 DetailViewController 中的 IBOutlet nil
【发布时间】: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 块。看看下面的答案。希望这会有所帮助:)

标签: ios xcode swift


【解决方案1】:

我能想到的唯一问题是,你的 self.eventImage 是 nil 并且它是一个隐式展开的可选,当你的故事板中的视图控制器被初始化时,属性 self.eventImage 被初始化。

如果您在详细信息 VC 的故事板中有不同的视图控制器,请尝试为其创建一个对象并将其分配给详细信息 VC 并尝试。希望这会有所帮助。

【讨论】:

  • 酷,谢谢。将尝试这个并查看情节提要的初始化位置。
  • 谢谢,问题如你所说,我在 DetailViewController 初始化之前调用了self.configure()。我应该做的就是设置事件的本地副本,并在viewWillAppear() 中调用self.configure()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多