试图引用Container View Controller

时间:2015-10-14 00:14:15

标签: ios swift

我目前正在尝试重新this navigation dropdown menu,以便下拉菜单仅占用窗口的下半部分。

这是我的故事板设置:

storyboard

不要担心无关的标签/按钮。我只想用这张照片展示不同的视图控制器/连接。)

我在获取对容器视图控制器的引用时遇到问题,以便我可以定义框架。这就是我现在所拥有的:

private var navigationController: UINavigationController?

在声明变量时:

self.navigationController = UIApplication.sharedApplication().keyWindow?.rootViewController?.presentedViewController?.presentedViewController?.childViewControllers[0] as? UINavigationController
println(self.navigationController!.nameOfClass) // logs: UINavigationController
self.navigationController = self.navigationController!.topMostViewController?.navigationController // 
println(self.navigationController!.nameOfClass) // logs: Optional(<UINavigationController: 0x7f8681e7b5f0>)UINavigationController

我在这里得到错误 - 在尝试为下拉菜单视图定义框架时:

var frame = CGRectMake(0, 0, titleSize.width + (self.configuration.arrowPadding + self.configuration.arrowImage.size.width)*2, self.navigationController!.navigationBar.frame.height)

我收到错误:

  

致命错误:在解包可选值时意外发现nil。

我知道这意味着什么,但我很困惑为什么价值为零。因为当我记录self.navigationController的类名时,我得到了正确的导航控制器。

此外,这里是nameOfClass和topMostViewController的参考:

extension UIViewController {
  var topPresentedViewController: UIViewController? {
    var target: UIViewController? = self
    while (target?.presentedViewController != nil) {
        target = target?.presentedViewController
    }
    print(target)
    return target
  }
  var topVisibleViewController: UIViewController? {
    if let navigation = self as? UINavigationController {
        if let visibleViewController = navigation.visibleViewController {
            return visibleViewController.topVisibleViewController
        }
    }
    if let tab = self as? UITabBarController {
        if let selectedViewController = tab.selectedViewController {
            return selectedViewController.topVisibleViewController
        }
    }
    return self
  }
  var topMostViewController: UIViewController? {
    return self.topPresentedViewController?.topVisibleViewController
  }
}

public extension NSObject{
  public class var nameOfClass: String{
    return NSStringFromClass(self).componentsSeparatedByString(".").last!
  }
  public var nameOfClass: String{
    return NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
  }
}

我尽量简明扼要,同时仍然提供足够的信息,但如果需要,我可以发布整个项目。任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:0)

UIViewController已经定义了navigationController属性https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instp/UIViewController/navigationController

我不知道你的代码在哪里self.navigationController!.navigationBar ...但也许它的范围让它获得了该名称的Cocoa属性,而不是你自己的。我不知道为什么编译器会让你重新声明一个具有相同名称的属性而不会发出警告,有关你的私人信息呢?

尝试为您的媒体使用其他名称。另外,请查看UIViewController presentingViewController,因为也许您可以使用它。