2009-06-07 67 views
4

我已经创建了一个自定义的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中是否需要初始化?

回答

3

如果它非常简单,我建议您在代码中创建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-

5

创建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一个方便的类方法,如果要做到这一点你喜欢的。

+0

如果您想通过使用Interface Builder来完成最后一部分(而不是在您的控制器中以编程方式设置customView),该怎么办?这可能吗?你会如何做到这一点? – Greg 2011-07-13 20:35:26

相关问题