prepareForSegue中未初始化的属性

时间:2014-10-30 01:29:36

标签: objective-c segue uisplitviewcontroller

我在管理segue时遇到了一些困难。我的视图控制器层次结构如下:

  • 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,但我需要设置一些数据。在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];
    }];

}

1 个答案:

答案 0 :(得分:0)

您可以在viewDidLoad中设置属性。 initWithCoder肯定太早,因为拆分视图控制器首先被实例化,然后是它所包含的其他控制器。所以,你可以在BHGSplitViewController的viewDidLoad中执行此操作,

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