自定义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中控件的初始化的主要内容,如果未能解决你的问题,请参考以下文章