自定义uiview中控件的初始化

时间:2011-01-26 13:57:02

标签: iphone objective-c interface-builder

我在IB中创建了一个自定义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

我在IB中将此视图上的文本视图与文本视图相关联,并将其链接到IBOutlet IUTextView * textView。 当我在我的UIViewController上拖动此自定义视图时(从IB的库中的类选项卡),视图为空。 - (id)initWithCoder:(NSCoder *)aDecoder正在调用但textView为null。 怎么了?感谢

2 个答案:

答案 0 :(得分:8)

据我记忆,在init中没有正确设置层次结构,因为只能在init完成后设置属性。

您想要使用

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

而是完全删除initWithCoder:内容。

作为旁注,你应该让你的班级名字以大写字母开头。

答案 1 :(得分:0)

应该没有什么能阻止你使用自定义的UIViewController,它有内置的方法来初始化或释放它包含的UIView。我发现这是一个更简单的解决方案。例如,您可以使用带有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;
}

当您像这样分配自定义UIViewController类时,将自动调用此initWithNibName实例方法

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

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