从概念上讲,您的计时器应该是的子类,UIView
而不是的子类NSObject
。
要在IB中实例化计时器的实例,只需将其UIView
拖放到视图控制器的视图上,并将其类设置为计时器的类名即可。
记住#import
您的视图控制器中的计时器类。
编辑:用于IB设计(有关代码实例化,请参见修订历史记录)
我对故事板一点都不熟悉,但是我确实知道您可以使用.xib
与使用故事板版本几乎相同的文件在IB中构建界面。您甚至应该甚至可以将整个视图从现有界面复制并粘贴到.xib
文件中。
为了测试这一点,我创建了一个.xib
名为“ MyCustomTimerView.xib” 的新空文件。然后,我添加了一个视图,并在其中添加了标签和两个按钮。像这样:
我创建了一个UIView
名为“ MyCustomTimer” 的新的Objective-C类子类。在我中,.xib
我将文件的Owner类设置为MyCustomTimer。现在,我可以像连接其他视图/控制器一样随意连接动作和插座。生成的.h
文件如下所示:
@interface MyCustomTimer : UIView
@property (strong, nonatomic) IBOutlet UILabel *displayLabel;
@property (strong, nonatomic) IBOutlet UIButton *startButton;
@property (strong, nonatomic) IBOutlet UIButton *stopButton;
- (IBAction)startButtonPush:(id)sender;
- (IBAction)stopButtonPush:(id)sender;
@end
剩下的唯一障碍是让它.xib
进入我的UIView
子类。使用.xib
大幅减少所需的设置。并且由于您使用情节提要板加载计时器,我们知道这-(id)initWithCoder:
是唯一将被调用的初始化程序。因此,实现文件如下所示:
#import "MyCustomTimer.h"
@implementation MyCustomTimer
@synthesize displayLabel;
@synthesize startButton;
@synthesize stopButton;
-(id)initWithCoder:(NSCoder *)aDecoder{
if ((self = [super initWithCoder:aDecoder])){
[self addSubview:
[[[NSBundle mainBundle] loadNibNamed:@"MyCustomTimerView"
owner:self
options:nil] objectAtIndex:0]];
}
return self;
}
- (IBAction)startButtonPush:(id)sender {
self.displayLabel.backgroundColor = [UIColor greenColor];
}
- (IBAction)stopButtonPush:(id)sender {
self.displayLabel.backgroundColor = [UIColor redColor];
}
@end
命名的方法loadNibNamed:owner:options:
确实像它听起来那样。它加载Nib并将“文件的所有者”属性设置为self。我们提取数组中的第一个对象,这就是Nib的根视图。我们将视图添加为子视图,然后将其显示在屏幕上。
显然,这只是在按下按钮时更改标签的背景颜色,但是此示例可以使您顺利进行。
基于注释的注释:
值得注意的是,如果遇到无限递归问题,您可能会错过此解决方案的巧妙技巧。它没有按照您认为的去做。看不到放置在情节提要中的视图,而是将另一个视图加载为子视图。它加载的视图是在笔尖中定义的视图。笔尖中的“文件所有者”是那种看不见的视图。最酷的部分是,这种看不见的视图仍然是Objective-C类,可以用作从笔尖引入的视图的各种视图控制器。例如,类中的IBAction
方法在MyCustomTimer
视图控制器中比在视图中期望更多。
附带说明一下,有些人可能会争辩说这打破了MVC
,我有些同意。从我的角度来看,它与custom紧密相关,custom UITableViewCell
有时也必须是部分控制器。
还值得注意的是,这个答案是提供一个非常具体的解决方案。创建一个可以在情节提要上布置的同一视图上多次实例化的笔尖。例如,您可以轻松地一次在iPad屏幕上想象其中的六个计时器。如果您只需要为视图控制器指定一个视图,该视图控制器将在您的应用程序中多次使用,那么jyavenard为这个问题提供的解决方案几乎可以肯定是您更好的解决方案。