objective-c - 我可以将 segues 与 View Controller 的指定初始化程序一起使用吗?

标签 objective-c ios uistoryboard segue

我是 Storyboard的新手,我已经设置了从按钮到 View Controller 的转场。此 View Controller 属于自定义子类 SFListViewController,它具有指定的初始化程序 initWithList:

使用指定的初始化程序是正确初始化 View Controller 的唯一方法。然而,当使用 segues 时,指定的初始化程序不会被调用(显然)。

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

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

最佳答案

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

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

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

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

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

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

希望对您有所帮助。

编辑:我可以验证 Proxy-Approach 是否有效,因为我刚刚遇到了与 ABPeoplePickerNavigationController 类似的问题,而这种方法运行良好。由于我们已经在 Storyboard中设置了东西,请注意您必须使用 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];
}

关于objective-c - 我可以将 segues 与 View Controller 的指定初始化程序一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8953015/

相关文章:

ios - 非常基本的自动布局

objective-c - 移至垃圾箱应删除依赖文件 cocoa

ios - Xcode 6 应用程序崩溃日志

ios - 应用程序崩溃并出现应用内购买错误

ios - Storyboard 中单个 UITableView 内的 10 个单元格(2 行,5 列)的网格

objective-c - Xcode 6.1 : Snapshotting a view that has not been rendered

ios - 从任何类别访问标签栏角标(Badge) - iOS

ios - UIImage动画快捷方式?

cocoa-touch - 如何关闭在 UIStoryboard 中呈现的模态框?

来自不同 Storyboard的 Swift PushViewController