2011-01-26 44 views
1

我在IB中创建了自定义uiview并为其设置了类。在自定义uiview中初始化控件

#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 

我把一个TextView文本这种观点在IB,并将其链接到IBOutlet中IUTextView * TextView的。 当我在UIViewController上拖动这个自定义视图时(从IB库中的类标签),视图是空的。 - (id)initWithCoder:(NSCoder *)aDecoder正在调用,但textView为null。 有什么不对?由于

回答

8

至于我记得,层次不正确设置在初始化,初始化为完成后的属性只能设置。

你想用

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

,而不是和完全消除initWithCoder:事情。

作为一个附注,你应该让你的课程名称以大写字母开头。

0

应该有什么使用其内置了用于初始化或重新分配了UIView,它包含的方法一个自定义的UIViewController阻止你。我发现这是一个更简单的解决方案。例如,您可以使用带有UIView的笔尖设置您的自定义UIViewController,然后确保将您的文件所有者设置为自定义类。

然后,您可以删除以下3种实例方法

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

,并在您的自定义UIViewController类使用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; 
} 

该initWithNibName实例方法,当你的Alloc您的自定义自动调用UIViewController这样的类

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

在initWithNibName中放置一个断点,您将看到它被调用。