iOS - 将自定义UIView放入视图控制器
我的iOS应用程序具有根视图控制器,并且我想在运行时为其添加一些自定义UIView
。我称这些自定义视图小部件,因为它们很小,除了大小,标签文本等基本相同。iOS - 将自定义UIView放入视图控制器
我为小部件和.xib文件创建了.h和.m。在我的根视图控制器viewDidLoad
我这样做:
TestMyView *cell = [[[NSBundle mainBundle] loadNibNamed:@"TestMyView" owner:self options:nil] objectAtIndex:0];
[self.view addSubview: cell];
它工作正常。不过,我仍然想不通:
- 为什么有例外
"[<TestViewController 0x7517210> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key mylabel"
如果我添加UILabel
mylabel IBOutlet中为我的自定义UIView类.h文件中。 (我拖放在IB中的UILabel,然后控制拖动到.h)创建视图时,我需要更改标签文本。我不明白为什么它会抱怨TestViewController,而我没有添加IBOutlet,但我的自定义视图.h类? - 那么我该如何正确更改标签文本呢?我不想为我的小部件创建视图控制器,因为我认为这不是必需的。我需要创建5-6个小部件,所以我需要为它们创建5-6个视图控制器?
- 它似乎initWithCoder不会调用时,我创建的部件?我看到苹果文档库说,如果从nib文件加载视图,这个方法会被调用。
如果你认为我吸在解释这一点,这是我的项目代码: https://dl.dropbox.com/u/43017476/custom.tar.gz
你很近。几个笔记。
1st - 当您从压区加载视图时,“所有者”是具有由nib引用的属性(IBOutlets)的类。这可能是TestMyView的一个实例。通常,创建自定义视图并让它加载它自己的笔尖(如下图所示)。
2nd - loadNibNamed返回NSARRAY,而不是UIVIEW;所以你需要将视图从数组中取出。
以下是创建自定义视图(部件)的例子:
CGRect frame = CGRectMake(nextLeft, nextTop, tileWidth, tileHeight);
TestMyView *widget = [[TestMyView alloc] initWithFrame:frame andFoo:foo];
[widget setWidgetTappedBlock:^{
// handle tap for this widget
}];
[self.widgetContainerView addSubview:widget];
这是你的自定义视图implemenatation的一部分:
@implementation TestMyView
- (id)initWithFrame:(CGRect)frame andFoo:(Foo *)foo
{
self = [super initWithFrame:frame];
if (self) {
[self setBackgroundColor:[UIColor clearColor]];
NSArray *nibObjects=[[NSBundle mainBundle] loadNibNamed:@"TestMyView" owner:self options:nil];
[self addSubview:[nibObjects objectAtIndex:0]];
// More initialization code
}
return self;
}
@end
和接口:
@interface ProductTileView : UIView
@property (nonatomic, weak) IBOutlet UIView *view;
@property (nonatomic, copy) ProductTappedBlock widgetTappedBlock;
- (id)initWithFrame:(CGRect)frame andFoo:(Foo *)foo;
@end
编辑: PS在y我们的例子,错误是由于所有者发送到loadNib是'self',这是您的视图控制器。您的视图控制器不具有“myLabel”属性,您的自定义视图不会。
我认为你必须开始他们befor添加到您的rootView!
TestMyView *cell = [[TestMyView alloc]initWithNibName:@"TestMyView" bundle:[NSBundle mainBundle]];
[self.view addSubview: cell];
感谢您的回答,但TestMyView是UIView的子类,而不是UIViewController,所以initWithNibName是不适合它的。 – chenxee 2013-02-16 17:01:39
第一点是正确的,它可能是一个问题。但对于第二个,我有一个问题。当我们在xib中创建视图时,为什么我们需要在代码中再次设置一个框架?而且当我们从nsbundle数组视图中提取视图时,我们需要输入我认为的类型。 +1 – 2013-02-16 18:00:14
您可以在IB中创建视图并将您的自定义类分配给它。不过,@Lukas动态创建'小部件'视图,几乎肯定会以编程方式将它们放置在屏幕上。在其他情况下,您可能不需要设置框架。 NSArray包含NSObject;而UIView是一个NSObject(子类)。我不认为演员缺乏会产生警告或降低可读性,但肯定不会伤害任何东西。 – Dave 2013-02-16 18:12:35
我不知道你在ios中的widget意见是什么意思。 – 2013-02-16 18:15:29