【问题标题】:uninitialized property in prepareForSegueprepareForSegue 中未初始化的属性
【发布时间】:2014-10-30 01:29:36
【问题描述】:

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

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

它们具有以下属性:

BHGSplitViewController:

@interface BHGSplitViewController : UISplitViewController

@property (nonatomic, strong) MasterViewController* masterVC;

@end

主视图控制器:

@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 中设置这些属性吗?

编辑:segue 的解释

所以,我在我的AppDelegate 中加载我的BHGSplitViewController 并将其设置为处理折叠等。之后,我需要立即显示一个模式视图以进行登录。我需要这个来像推动一样进行动画处理(但 Apple 不允许这样做),所以我试图通过使用自定义 segue 来破解我的方式(这是 hacky,我讨厌它):

现在的转场:

- (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];
    }];

}

【问题讨论】:

    标签: objective-c segue uisplitviewcontroller


    【解决方案1】:

    您可以在 viewDidLoad 中设置属性。 initWithCoder 绝对为时过早,因为拆分视图控制器首先被实例化,然后是它所容纳的其他控制器。所以,你可以在 BHGSplitViewController 的 viewDidLoad 中做到这一点,

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

    【讨论】:

    • 试试这个...self.viewcontrollers 有两个 UINavigationControllers 但都是空的
    • @oflannabhra,你怎么知道它们是空的? nav.topViewController 的日志是否给您 nil?
    • 对不起,在我分配它们的viewDidLoad 方法中不是空的,在我尝试设置它们的prepareForSegue 中它们是空的。我将从模态视图返回 splitView。我认为prepareForSegue 正在执行,然后splitView 的viewDidLoad 方法正在执行。为清楚起见更新问题
    • @oflannabhra,这不应该发生。 viewDdiLoad 在控制器的生命周期内只被调用一次。如果 viewDidLoad 再次被调用,那么你做错了什么。你用的是什么类型的segue?
    • 用更多信息更新了原始问题
    猜你喜欢
    • 1970-01-01
    • 2019-12-02
    • 2021-06-21
    • 2017-03-03
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多