2014-10-30 87 views
0

我在管理segue時遇到了一些困難。我的視圖控制器層次結構如下所示:prepareForSegue中的未初始化屬性

  • BHGSplitViewController(UISplitViewController的子類)
    • 的UINavigationController
      • MasterViewController(的UITableViewController的子類)
    • 的UINavigationController
      • DetailViewController(的子類UIViewController)

這些具有以下性質:

BHGSplitViewController:

@interface BHGSplitViewController : UISplitViewController 

@property (nonatomic, strong) MasterViewController* masterVC; 

@end 

MasterViewController:

@interface MasterViewController : UITableViewController 

@property (strong, nonatomic) MenuDataSource *menuDataSource; 
@property (strong, nonatomic) DetailViewController *detailViewController; 

@end 

DetailViewController:

@interface DetailViewController : UIViewController 

@property (strong, nonatomic) NSURL* URL; 
@property (strong, nonatomic) IBOutlet UIWebView *webView; 

@end 

這些在我的主要故事板通過關係segues相關。

在最初的應用程序啓動後,我模態地顯示登錄視圖控制器。登錄後,我回到我的BHGSplitViewController,但我需要設置一些數據。在loginViewControllerprepareForSegue方法我嘗試以下操作:

BHGSplitViewController *splitVC = [segue destinationViewController]; 
splitVC.masterVC.menuDataSource.var = someValue; 

但是,在調試時,splitVC.masterVC = nil,所以很明顯試圖在它是行不通的設定值。我如何設置並保留這些關係?

我繼承了這個應用程序的一個版本,它是用故事板構建的。我猜我需要開始初始化這些屬性。用故事板做這件事的最好方法是什麼?我需要覆蓋initWithCoder:嗎?我應該在viewDidLoad中設置這些屬性嗎?

編輯:賽格瑞

的解釋所以,我加載了我的BHGSplitViewController在我AppDelegate並設置它來處理崩塌等在那之後,我需要立即顯示登錄模態的視圖。我需要這個動畫像一個推(但蘋果不會允許),所以我試圖通過使用自定義賽格(這是哈克,我討厭它)破解我的方式:

Present Segue公司:

- (void)perform { 

    UIViewController *srcViewController = (UIViewController *) self.sourceViewController; 
    UIViewController *destViewController = (UIViewController *) self.destinationViewController; 

    UIView *prevView = srcViewController.view; 
    UIView *destView = destViewController.view; 

    UIWindow *window = [[[UIApplication sharedApplication] delegate] window]; 

    [window insertSubview:destView aboveSubview:prevView]; 

    [destView enterLeft:0.1 then:^{ 
     [srcViewController presentViewController:destViewController animated:NO completion:nil]; 
    }]; 

} 

辭退Segue公司:

- (void)perform { 

    UIViewController *srcViewController = (UIViewController *) self.sourceViewController; 
    UIViewController *destViewController = self.destinationViewController; 

    UIView *prevView = srcViewController.view; 

    UIView *destView = destViewController.view; 


    UIWindow *window = [[[UIApplication sharedApplication] delegate] window]; 

    [window insertSubview:destView aboveSubview:prevView]; 

    [destView enterRight:0.1 then:^{ 
     [srcViewController presentViewController:destViewController animated:NO completion:nil]; 
    }]; 

} 

回答

0

可以在viewDidLoad中設置的屬性。由於首先實例化了分割視圖控制器,所以initWithCoder絕對爲時尚早,然後是其他控制器。所以,你可以在BHGSplitViewController的viewDidLoad中做到這一點,

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    UINavigationController *nav = (UINavigationController *)self.viewControllers.firstObject; 
    self.masterVC = (MasterViewController *)nav.topViewController; 
} 
+0

嘗試此...'self.viewcontrollers'有兩個'UINavigationController's但都是空 – oflannabhra 2014-10-30 14:45:55

+0

@oflannabhra,你怎麼知道他們是空的? nav.topViewController的日誌是否給你零? – rdelmar 2014-10-30 15:08:06

+0

對不起,在我分配它們的'viewDidLoad'方法中不是空的,它們在'prepareForSegue'中是空的,我試圖設置它們。我將從模態視圖返回到splitView。我認爲'prepareForSegue'正在執行,那麼splitView的'viewDidLoad'方法正在執行。更新問題的清晰度 – oflannabhra 2014-10-30 15:18:17