我在管理segue时遇到了一些困难。我的视图控制器层次结构如下:
它们具有以下属性:
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
,但我需要设置一些数据。在loginViewController
prepareForSegue
方法中,我尝试以下操作:
BHGSplitViewController *splitVC = [segue destinationViewController];
splitVC.masterVC.menuDataSource.var = someValue;
但是,在调试splitVC.masterVC = nil
时,显然尝试在其上设置值是行不通的。如何设置和保留这些关系?
我继承了这个用故事板构建的应用程序版本。我猜我需要开始初始化这些属性。使用故事板最好的方法是什么?我需要覆盖initWithCoder:
吗?我应该在viewDidLoad
中设置这些属性吗?
编辑:segue的解释
所以,我在我的BHGSplitViewController
中加载我的AppDelegate
并设置它来处理崩溃等。之后,我需要立即显示登录的模态视图。我需要这个像推动一样动画(但Apple不会允许),所以我试图通过使用自定义segue(这是hacky而我讨厌它)破解我的方式:< / p>
现在的争论:
- (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 :(得分:0)
您可以在viewDidLoad中设置属性。 initWithCoder肯定太早,因为拆分视图控制器首先被实例化,然后是它所包含的其他控制器。所以,你可以在BHGSplitViewController的viewDidLoad中执行此操作,
-(void)viewDidLoad {
[super viewDidLoad];
UINavigationController *nav = (UINavigationController *)self.viewControllers.firstObject;
self.masterVC = (MasterViewController *)nav.topViewController;
}