2011-01-26 16 views
1

私はIBでカスタムUIを作成し、そのクラスを設定しました。カスタムUIのコントロールの初期化

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 

@interface myView : UIControl { 
    IBOutlet UITextView *textView; 
} 
@end 

#import "myView.h" 

@implementation myView 

- (void)commonInit 
{ 
    [textView setText:@"lajsdfklasdfjl"]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super initWithCoder:aDecoder]) 
    { 
     [self commonInit]; 
    } 
    return self; 
} 

-(id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     [self commonInit]; 
    } 
    return self; 
} 

@end 

このビューのテキストビューにIBを配置し、それをIBOutlet IUTextView * textViewにリンクしました。 私のUIViewController(IBのライブラリ内のクラスタブから)にこのカスタムビューをドラッグすると、ビューは空です。 - (id)initWithCoder:(NSCoder *)aDecoderは呼び出していますが、textViewはnullです。 どうしたのですか?ありがとう

答えて

8

私が覚えている限り、プロパティはinitの終了後にしか設定できないので、階層は正しく設定されていません。

代わり

-(void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    [self commonInit]; 
} 

を使用し、完全にinitWithCoder:ものを削除します。

補足として、クラス名は大文字で始める必要があります。

0

カスタムUIViewControllerを使用することから何も止めてはいけません。カスタムUIViewControllerには、それに含まれるUIViewを初期化または解除するためのメソッドが組み込まれています。私はこれがより簡単な解決策であることを発見しました。たとえば、UIViewでペンを使用してカスタムUIViewControllerを設定し、File's Ownerがカスタムクラスに設定されていることを確認できます。

カスタムのアロケーションと、このinitWithNibNameインスタンスメソッドが自動的に呼び出されます

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
     self.view.frame = CGRectMake(0, 44, self.view.frame.size.width, self.view.frame.size.height); 
    } 
    return self; 
} 

以下のようにあなたは、その後、次の3つのインスタンスメソッド

- (void)commonInit 
- (id)initWithCoder:(NSCoder *)aDecoder 
- (id)initWithFrame:(CGRect)frame 

と、カスタムのUIViewControllerクラス使用initWithNibName内を削除することができますこのようなUIViewControllerクラス

CustomUIViewController *vc = [[CustomUIViewController alloc] init]; 

initWithNibNameにブレークポイントを設定すると、そのブレークポイントが呼び出されます。

関連する問題