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

10 objective-c ios uistoryboard segue

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

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

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

如何执行segue调用指定的初始值设定项?

Bes*_*esi 5

据我知道这是不可能的,因为故事板框架简单地调用alloc,并init在类,你在InterfaceBuilder中定义.此外,segue的destinationViewController属性是只读的,因此您不能简单地替换现有的ViewController.

使用Storyboarding的唯一方法可能是创建一个包装器类,它在内部实例化SFListViewController具有所需属性,然后作为代理对象运行,从而传播viewDid***viewWill***方法到包装类,并在readonly中返回包装VC的视图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];
}
Run Code Online (Sandbox Code Playgroud)