10

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

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

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

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

4

1 回答 1

5

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

使用 Storyboard的唯一方法可能是创建一个包装类,它在内部实例化SFListViewController具有所需属性的财产...你明白了。viewDid***viewWill***view

UIViewController在这种情况下,通常有许多替代方法来初始化 a :

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

  2. prepareForSegue:像您尝试过的那样,在您的根 ViewController 中覆盖该方法并在那里执行“post-alloc-init-initialisation”。

  3. 如果最坏的情况最坏,您可以回退到一个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];
}
于 2012-01-21T13:03:47.977 回答