2011-01-20 6 views
5

私は何か本当にトリッキーなことをしようとしていますが、私はまだ一点で立ち往生しています。他のNibファイルと他のUIViewControllerから継承したNibファイルでUIViewControllerをインスタンス化しようとしています。
問題は、私が息子UIViewControllerをインスタンス化するときです。 super classを呼ぶが、それは唯一、独自のnibファイルを呼び出す必要がありinitWithNibName:bundle:Nibファイルと継承を使用したUIViewController

// SonViewController 
- (id)initWithNibName:(NSString *)nibNameOrNil 
       bundle:(NSBundle *)nibBundleOrNil 
{ 
    if ((self = [super initWithNibName:nibNameOrNil 
           bundle:nibBundleOrNil])) { 
     // Custom initialization. 
    } 
    return self; 
} 

initメソッド。それだけのinit

// MotherViewController 
- (id)initWithNibName:(NSString *)nibNameOrNil 
       bundle:(NSBundle *)nibBundleOrNil 
{ 
    if ((self = [super initWithNibName:@"MotherViewController" 
           bundle:nibBundleOrNil])) { 
     // Custom initialization. 
    } 
    return self; 
} 

Mother ClassとそのIBオブジェクトを表示:スーパークラスでは、私はinitWithNibName:bundle:メソッドをオーバーライドし、そのようnibName自分自身を入れてみました。私は理由を理解していますが、私は自分がしたいことをすることは不可能だと考え始めます。なにか提案を ?

編集:私はちょうどそのように私SonViewControllerを使用し

SonViewController *son = [[SonViewController alloc] 
         initWithNibName:@"SonViewController" bundle:[NSBundle mainBundle]]; 

[self.navigationController pushViewController:son animated:YES]; 
[son release]; 

それは息子と母IBオブジェクトを表示する必要があります...

よろしく、
kl94

答えて

1

これは古いスレッドだと知っていますが、信じられないほどのブログ投稿hereが見つかりました。

基本的に、親クラスのすべてのビューを反復処理し、それらを子ビューとして子ビューに追加する必要があります。ここで私は私のプロジェクトでそれを実装する方法は次のとおりです。

// ChildViewController.m 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self addSubviewsFromSuperclass]; 
} 

// ParentViewController.h 
- (void)addSubviewsFromSuperclass; 

// ParentViewController.m 
- (void)addSubviewsFromSuperclass 
{ 
    UIView *selfView = self.view; 
    UIView *nibView = nil; 
    @try 
    { 
     nibView = [NSBundle.mainBundle loadNibNamed:NSStringFromClass([self superclass]) owner:self options:nil][0]; 
    } 
    @catch (NSException *exception) 
    { 
     NSLog(@"Something exceptional happened while loading nib:\n%@", exception); 
    } 
    self.view = selfView; 
    for (UIView *view in nibView.subviews) 
    { 
     [self.view addSubview:view]; 
    } 
} 

addSuviewsFromSuperclass方法は私のコーディングされていないこと。私は上記のblogpostの著者に全面的な信用を与える必要があります。彼のサンプルプロジェクトをダウンロードすると、彼のJMViewController.mで見つけることができます。

+0

あなたが言ったように、これは非常に古い投稿です。しかし、あなたのおかげで、私は2つのxibを持つ2つのビューコントローラを作成し、一方を他方から継承する方法を知っています。ありがとう – klefevre

3

通常、このためinitメソッドでは特定のペン先を使用するだけで、initWithNibName:bundle:では使用しないでください。

その後
@implementation MotherViewController 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
     //custom initialization 
    } 
    return self; 
} 
- (id)init { 
    return [self initWithNibName:@"MotherViewController" bundle:nil]; 
} 

、あなただけ[[MotherViewController alloc] init];を使用し、MotherViewControllerのデフォルトのペン先を使用します。

代わりに、この理由で、MotherViewControllerで別の初期化子を定義することができます。

@implementation MotherViewController 
- (id)_initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
     //custom initialization 
    } 
    return self; 
} 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    return [self _initWithNibName:@"MotherViewController" bundle:nibBundleOrNil]; 
} 

次に、プライベートカテゴリインターフェイスを使用して、このメソッドについてSonViewControllerに通知します。

//SonViewController.m 
@interface MotherViewController (PrivateInit) 
- (id)_initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; 
@end 
@implementation SonViewController 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
     //custom initialization 
    } 
    return self; 
} 
+0

私はそれを動作させることができませんでした。私は私のSonViewControllerを使用したいと表示するために投稿を更新しました – klefevre

関連する問題