10

私はストーリーボードが初めてで、ボタンからビューコントローラーへのセグエを設定しました。SFListViewControllerこのビュー コントローラは、指定されたイニシャライザを持つカスタム サブクラスinitWithList:です。

指定されたイニシャライザを使用することが、View Controller を正しく初期化する唯一の方法です。ただし、セグエを使用する場合、指定された初期化子は呼び出されません (明らかに)。

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

実行時にセグエ呼び出しを指定されたイニシャライザーにするにはどうすればよいですか?

4

1 に答える 1

5

私の知る限り、ストーリーボードフレームワークは、Interfacebuilderで定義したクラスをalloc呼び出すだけなので、これは不可能です。initさらに、segueのdestinationViewController属性は読み取り専用であるため、既存のViewControllerを単純に置き換えることもできません。

SFListViewControllerStoryboardingを使用する唯一の方法は、必要な属性でを内部的にインスタンス化し、プロキシオブジェクトとして機能するラッパークラスを作成することです。これにより、ラップされたクラスにメソッドviewDid***とメソッドが伝播viewWill***され、ラップされたVCのビューが読み取り専用で返されます。viewプロパティ...あなたはアイデアを得る。

UIViewController一般に、このような場合にを初期化するための代替方法がいくつかあります。

  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 に答える