2012-01-21 2 views
10

私はストーリーボードには新しく、ボタンからビューコントローラーへのセグを設定しました。このビューコントローラはカスタムサブクラスSFListViewControllerであり、指定された初期化子initWithList:を持っています。ビューコントローラの指定されたイニシャライザでセグを使用できますか?

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

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

実行時にsegueを指定された初期化子に呼び出すにはどうすればよいですか?

+0

1良い質問ですInterface Builderのオブジェクトをインスタンス化させるとき、私は同様の問題を持っていました。 – Besi

答えて

5

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

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

は、一般的に、このような場合にはUIViewControllerを初期化する別の方法がいくつかあります:

  1. 初期化のために使用することができ、「ユーザー定義のランタイム属性」を指定するオプションがあります。

  2. あなたが試したように、ルートViewControllerでprepareForSegue:メソッドをオーバーライドし、そこに「post-alloc-init-initialisation」を実行します。

  3. 最悪の場合は、IBActionに戻ってViewControllerを自分で初期化することができます。

これが役立ちます。

編集:私はちょうどこのアプローチはうまく働いていたABPeoplePickerNavigationControllerと同様の問題に出くわしたので、プロキシのアプローチが機能するかどうかを確認することができます。私たちがストーリーボードに設定したので、(initメソッドの代わりに)初期設定を行うためにawakeFromNibを使用しなければならないことに注意してください。これは私のラッパークラスのコードです

#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]; 
} 
関連する問題