自定义uiview中控件的初始化

Posted

技术标签:

【中文标题】自定义uiview中控件的初始化【英文标题】:Initialization of controls in custom uiview 【发布时间】:2011-01-26 13:57:02 【问题描述】:

我在 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 中的这个视图上放了一个带有文本的 textview,并将它链接到 IBOutlet IUTextView *textView。 当我将这个自定义视图拖到我的 UIViewController 上时(来自 IB 库中的类选项卡),视图是空的。 - (id)initWithCoder:(NSCoder *)aDecoder 正在调用,但 textView 为空。 怎么了?谢谢

【问题讨论】:

【参考方案1】:

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

你想用

-(void)awakeFromNib

    [super awakeFromNib];
    [self commonInit];

而是完全删除 initWithCoder: 的东西。

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

【讨论】:

【参考方案2】:

应该没有什么可以阻止您使用自定义 UIViewController,它具有用于初始化或解除分配它所包含的 UIView 的内置方法。我发现这是一个更简单的解决方案。例如,您可以使用带有 UIView 的 nib 设置自定义 UIViewController,然后确保将 File's Owner 设置为自定义类。

然后您可以删除以下 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 中放置一个断点,你会看到它被调用。

【讨论】:

以上是关于自定义uiview中控件的初始化的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C UI之自定义轮播图控件

swift 纯代码自定义控件

iOS:从笔尖加载自定义 UIView

自定义 UIView 的子视图未出现在 UI 测试中

使用 XIB 创建自定义 UIView

IOS UIView 04- 自定义控件