访问父的UIViewController其子女UIViewControllers

问题描述:

我有一个名为UIViewControllerContainer,即房屋其他两个子UIViewControllersMasterDetail访问父的UIViewController其子女UIViewControllers

我的问题是试图从其子控制器访问Container

应用程序委托代码:

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 
    var window: UIWindow? 
    var container: Container? 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     window = UIWindow(frame: UIScreen.mainScreen().bounds) 
     container = Container(nibName: "Container", bundle: nil) 
     window?.rootViewController = Container() 
     window?.makeKeyAndVisible() 
     return true 
    } 

    func appShowDetailView(vc:UIViewController){ 
     container!.showDetailView(vc) 
    } 
} 

集装箱代码:

import UIKit 

class Container: UIViewController { 

    var masterView:UIViewController? 
    var detailView:UIViewController? 
    var masterViewFrame = CGRectMake(0, 0, 0, 0) 
    var detailViewFrame = CGRectMake(0, 0, 0, 0) 
    var detailOnScreenFrame = CGRectMake(0, 0, 0, 0) 
    var detailOffScreenFrame = CGRectMake(0, 0, 0, 0) 
    var masterViewHeight:CGFloat = 50 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     masterView = MenuViewController(nibName: "MenuViewController", bundle: nil) 
     detailView = RootViewController(nibName: "RootViewController", bundle: nil) 
     masterViewFrame = CGRectMake(0, 0, self.view.frame.width, masterViewHeight) 
     detailViewFrame = CGRectMake(0, masterViewHeight, self.view.frame.width, self.view.frame.height - masterViewHeight) 
     detailOffScreenFrame = CGRectMake(detailViewFrame.origin.x, detailViewFrame.origin.y + detailViewFrame.height, detailViewFrame.width, detailViewFrame.height) 
     detailOnScreenFrame = detailViewFrame 
     self.addChildViewController(masterView!) 
     self.addChildViewController(detailView!) 
     masterView!.view.frame = masterViewFrame 
     detailView!.view.frame = detailViewFrame 
     self.view.addSubview(masterView!.view) 
     self.view.addSubview(detailView!.view) 
    } 

    func cycleDetailView(from:UIViewController, toView to:UIViewController){ 
     from.willMoveToParentViewController(nil) 
     self.addChildViewController(to) 
     to.view.frame = self.detailOffScreenFrame 
     self.detailView = to 
     self.transitionFromViewController(from, toViewController: to, duration: 0.25, options: UIViewAnimationOptions.allZeros, 
      animations: {() -> Void in 

       // send the new view controller in, and the old one out 
       to.view.frame = self.detailOnScreenFrame 
       from.view.frame = self.detailOffScreenFrame 
      }, completion: {success -> Void in 

       // tells the view controllers cycling has ended 
       from.removeFromParentViewController() 
       to.didMoveToParentViewController(self) 
      } 
     ) 
    } 

    func showDetailView(vc: UIViewController){ 
     if let oldView = detailView { 
      cycleDetailView(oldView, toView: vc) 
     }else{ 
      detailView = self.childViewControllers[1] as? UIViewController 
      if let oldView = detailView { 
       cycleDetailView(oldView, toView: vc) 
      }else{ 

      } 
     } 
    } 
} 

问题在于showDetailView()。当这是由一段代码被称为是这样的:

let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate 
    if let delegateUnwrapped = appDelegate { 
     delegateUnwrapped.appShowDetailView(aViewController) 
    } 

...集装箱功能showDetailView()只能获得零值detailViewself.childViewControllers是一个空数组。

这让我想我正在以错误的方式访问子视图控制器。

谁能告诉我我哪里出错了吗?

TIA。

我觉得你的问题是这条线在应用程序的委托,

window?.rootViewController = Container() 

这将创建容器,不就是对应于集装箱属性之一的新实例。将该行更改为,

window?.rootViewController = container