我可以将 segue 与视图控制器的指定初始化程序一起使用吗?

Posted

技术标签:

【中文标题】我可以将 segue 与视图控制器的指定初始化程序一起使用吗?【英文标题】:Can I use segues with designated initializers of view controllers? 【发布时间】:2012-02-15 16:53:04 【问题描述】:

我是故事板的新手,我已经设置了从按钮到视图控制器的 segue。这个视图控制器是一个自定义子类SFListViewController,它有一个指定的初始化器initWithList:

使用指定的初始化器是正确初始化视图控制器的唯一方法。但是,当使用 segues 时,不会调用指定的初始化程序(显然)。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
  if ([segue.identifier isEqualToString:@"Show List"]) 
    SFListViewController *listViewController = segue.destinationViewController;
    // ????
  

如何让 segue 在执行时调用指定的初始化程序?

【问题讨论】:

+1 这是个好问题,我在让 Interface Builder 实例化对象时遇到了类似的问题。 【参考方案1】:

据我所知,这是不可能的,因为情节提要框架只是在您在 Interfacebuilder 中定义的类上调用 allocinit。此外,segue 的 destinationViewController 属性是只读的,因此您也不能简单地替换现有的 ViewController。

使用 Storyboard 的唯一方法可能是创建一个包装类,它在内部实例化具有所需属性的 SFListViewController,然后充当代理对象,从而将 viewDid***viewWill*** 方法传播到包装的类,并在只读的view 属性中返回包装的 VC 视图......你明白了。

在这种情况下,通常有多种替代方法可以初始化UIViewController

    有一个选项可以指定可用于初始化的“用户定义的运行时属性”。

    在根 ViewController 中重写 prepareForSegue: 方法,就像您尝试过的那样,并在那里执行“post-alloc-init-initialisation”。

    如果最坏的情况发生,您可以退回到IBAction,以便能够自己初始化 ViewController。

我希望这会有所帮助。

编辑:我可以验证代理方法是否有效,因为我刚刚遇到ABPeoplePickerNavigationController 的类似问题,这种方法效果很好。由于我们已经在故事板中设置了这个东西,请注意您必须使用 awakeFromNib 才能进行初始配置(而不是某些 init 方法)。

这是我的包装类的代码:

#import "PeoplePickerViewControllerWrapper.h"

@implementation PeoplePickerViewControllerWrapper

@synthesize ppvc = _ppvc;  // This is the object I'm proxying (The proxyee so to speak)
@synthesize delegate = _delegate;

- (void)awakeFromNib

        self.ppvc = [[ABPeoplePickerNavigationController alloc] init ];
        self.ppvc.peoplePickerDelegate = self;
        self.ppvc.addressBook = ABAddressBookCreate(); 
        self.ppvc.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]];


#pragma mark - View lifecycle

- (void)loadView

    [super loadView];
    [self.ppvc loadView];


- (void)viewDidLoad

    [super viewDidLoad];
    [self.ppvc viewDidLoad];


-(void)viewWillAppear:(BOOL)animated
    [super viewWillAppear:animated];
    [self.ppvc viewWillAppear:animated];


-(void)viewDidDisappear:(BOOL)animated
    [super viewDidDisappear:animated];
    [self.ppvc viewDidDisappear:animated];


-(UIView *)view
    return self.ppvc.view;


- (void)viewDidUnload

    [super viewDidUnload];
    [self.ppvc viewDidUnload];

【讨论】:

以上是关于我可以将 segue 与视图控制器的指定初始化程序一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

segueing时出现核心数据错误:无法在NSManagedObject类上调用指定的初始值设定项

拆分视图控制器 segue 和连接

Segue 错误 - 未能在 nsmanagedobject 类上调用指定的初始化程序

show segue 后我的视图控制器没有被取消初始化

与 segue 一起传递数据

将 segue 展开到尚未呈现的视图控制器?