从多个视图控制器使用自定义UIView
我已经创建了一个自定义的UIView,我想在我的iPhone应用程序中的多个不同的视图控制器上使用。目前,我已经复制了包含来自第一个视图控制器的nib文件的控件的UIView,将其粘贴到其他视图控制器中,然后将所有动作连接到每个视图控制器。这工作正常,但不是我想要使用此自定义视图的最佳方式。从多个视图控制器使用自定义UIView
我的自定义视图非常简单,它由一些带有标签的UIButton组成,并点击这些按钮触发更改视图控制器视图上控件内容的操作。
什么是一个策略来巩固这个UIView的定义和用法?理想情况下,我只想从视图控制器的笔尖引用此自定义视图,并让视图控制器响应此自定义视图中的操作。
编辑:好的,根据J.Biard的建议,我尝试了以下运气不多。
我创建了另一个基于UIView的nib文件,其中包含我的可重用视图和UIView子类.m和.h文件的内容(现在只是一些UIButton对象),然后将nib File的Owner类设置为我新创建的类名。
然后,我添加了来自J.Biard的大部分代码(我将rect更改为50,50,100,100,现在将setDelegate省略了,因为我现在只是试图让它工作,并且我发现[self.view addSubview:view]比[self addSubView:view])工作得更好,直到应用程序启动时显示的第一个视图控制器的viewDidLoad方法结束。
我现在得到的是我的主视图,里面有一个黑色方块。我是否错过了某个插座,或者在UIView子类的initWithFrame或drawRect中是否需要初始化?
如果它非常简单,我建议您在代码中创建UIView的子类并创建此类的实例(或者您可以使用Interface Builder创建自定义UIView,然后将其存档到NIB文件中并在稍后恢复也使用代码)。
使用代码的解决方案,你可以通过调用类似建立在你的控制器自定义的UIView的实例:
#import "MyCustomView.h"
// let the superview decide how big it should be or set it as needed.
CGRect sizeRect = CGRectMake(0,0,0,0);
// create an instance of your view
MyCustomView *view = [MyCustomView alloc] initWithFrame:sizeRect];
// set a custom delegate on the view or set callback methods using @selector()...
[view setDelegate:self]; // self = view controller
// add the view to the controller somewhere... (eg: update CGRect above as needed)
[self addSubView:view];
// don't forget to release the view somewhere ;-)
这个例子假定您创建一个委托协议,您的视图控制器可以响应或者您也可以使用@selector动态连接事件。如果你不想在代码中创建视图的实例,你可以在你的NIB文件中添加一个“UIView”,并在巡视窗口中设置它的类类型(命令 - > 4 - > class下拉菜单)。 (NSArray *)loadNibNamed:(NSString *)名称所有者:(id)所有者选项:(NSDictionary *)选项“如果您想在界面构建器中完成所有工作,您可以创建自定义UIView并使用类似于” (请参阅NSBundle)动态加载NIB文件。尽管它也是可行的,但这表现出它自己的挑战。
最涉及的选项是创建自己的xcode自定义UI库/插件,以便像Apple提供的任何其他控件一样将自定义控件/视图从库窗口拖动到每个NIB文件中。
希望能够澄清或消除为您重新使用控件的某些选项。
Cheers-
创建MyCustomView类和nib文件。
在nib文件中,将文件所有者设置为MyCustomView - 然后像平常一样设计视图,并使用*UIView。在MyCustomView中创建一个IBOutlet,以链接到您的笔尖文件中的*UIView。
在MyCustomView添加这个方法:
- (BOOL) loadMyNibFile {
if (![[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil]) {
return NO;
}
return YES;
}
在您的视图控制器,你可以使用像这样
- (void)viewDidLoad {
MyCustomView *customView = [[MyCustomView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
[customView loadMyNibFile];
[self.view addSubview:customView.view]; //customView.view is the IBOutlet you created
[customView release];
}
这个自定义视图,您还可以创建MyCustomView一个方便的类方法,如果要做到这一点你喜欢的。
如果您想通过使用Interface Builder来完成最后一部分(而不是在您的控制器中以编程方式设置customView),该怎么办?这可能吗?你会如何做到这一点? – Greg 2011-07-13 20:35:26