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”属性,您的自定义视图不会。

+0

第一点是正确的,它可能是一个问题。但对于第二个,我有一个问题。当我们在xib中创建视图时,为什么我们需要在代码中再次设置一个框架?而且当我们从nsbundle数组视图中提取视图时,我们需要输入我认为的类型。 +1 – 2013-02-16 18:00:14

+0

您可以在IB中创建视图并将您的自定义类分配给它。不过,@Lukas动态创建'小部件'视图,几乎肯定会以编程方式将它们放置在屏幕上。在其他情况下,您可能不需要设置框架。 NSArray包含NSObject;而UIView是一个NSObject(子类)。我不认为演员缺乏会产生警告或降低可读性,但肯定不会伤害任何东西。 – Dave 2013-02-16 18:12:35

+0

我不知道你在ios中的widget意见是什么意思。 – 2013-02-16 18:15:29

我认为你必须开始他们befor添加到您的rootView!

TestMyView *cell = [[TestMyView alloc]initWithNibName:@"TestMyView" bundle:[NSBundle mainBundle]]; 
[self.view addSubview: cell]; 
+0

感谢您的回答,但TestMyView是UIView的子类,而不是UIViewController,所以initWithNibName是不适合它的。 – chenxee 2013-02-16 17:01:39