ดีที่จะตอบแนวคิดเวลาของคุณมีแนวโน้มที่ควรจะเป็น subclass ของแทนUIViewNSObject
ในการสร้างอินสแตนซ์ของตัวจับเวลาของคุณใน IB เพียงแค่ลากตัวจับเวลาออกจากUIViewมุมมองของตัวควบคุมมุมมองของคุณและตั้งค่าคลาสเป็นชื่อคลาสของตัวจับเวลาของคุณ

อย่าลืม#importคลาสจับเวลาของคุณในตัวควบคุมมุมมองของคุณ
แก้ไข: สำหรับการออกแบบ IB (สำหรับการสร้างอินสแตนซ์โค้ดดูประวัติการแก้ไข)
ฉันไม่ค่อยคุ้นเคยกับสตอรีบอร์ด แต่ฉันรู้ว่าคุณสามารถสร้างอินเทอร์เฟซของคุณใน IB โดยใช้.xibไฟล์ที่เกือบจะเหมือนกับการใช้สตอรีบอร์ดเวอร์ชัน คุณควรจะสามารถคัดลอกและวางมุมมองของคุณโดยรวมจากอินเทอร์เฟซที่คุณมีอยู่ไปยัง.xibไฟล์
เพื่อทดสอบสิ่งนี้ฉันได้สร้างช่องว่างใหม่.xibชื่อ "MyCustomTimerView.xib" จากนั้นฉันก็เพิ่มมุมมองและเพิ่มป้ายกำกับและปุ่มสองปุ่ม ชอบมาก:

ฉันสร้างคลาสย่อยUIViewObject -C คลาสใหม่ชื่อ "MyCustomTimer" ในของฉัน.xibฉันจะตั้งค่าของฉันเจ้าของไฟล์ของระดับที่จะ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 และตั้งค่าคุณสมบัติ "File's Owner" เป็น self เราแยกออบเจ็กต์แรกในอาร์เรย์และนั่นคือมุมมองรูทของ Nib เราเพิ่มมุมมองเป็นมุมมองย่อยและ Voila อยู่บนหน้าจอ
เห็นได้ชัดว่านี่เป็นเพียงการเปลี่ยนสีพื้นหลังของป้ายกำกับเมื่อกดปุ่ม แต่ตัวอย่างนี้จะช่วยให้คุณเดินทางได้ดี
หมายเหตุตามความคิดเห็น:
เป็นที่น่าสังเกตว่าหากคุณได้รับปัญหาการเรียกซ้ำแบบไม่สิ้นสุดคุณอาจพลาดเคล็ดลับเล็กน้อยของวิธีแก้ปัญหานี้ มันไม่ได้ทำอย่างที่คุณคิด มุมมองที่ใส่ในสตอรีบอร์ดจะไม่เห็น แต่จะโหลดมุมมองอื่นเป็นมุมมองย่อยแทน มุมมองที่โหลดคือมุมมองที่กำหนดไว้ในปลายปากกา "เจ้าของไฟล์" ในปลายปากกาคือมุมมองที่มองไม่เห็น ส่วนที่น่าสนใจคือมุมมองที่มองไม่เห็นนี้ยังคงเป็นคลาส Objective-C ซึ่งอาจใช้เป็นตัวควบคุมมุมมองประเภทต่างๆสำหรับมุมมองที่นำเข้ามาจากปลายปากกา ตัวอย่างเช่นIBActionวิธีการในMyCustomTimerคลาสเป็นสิ่งที่คุณคาดหวังในตัวควบคุมมุมมองมากกว่าในมุมมอง
ตามหมายเหตุด้านข้างบางคนอาจโต้แย้งว่าการหยุดพักนี้MVCและฉันเห็นด้วยบ้าง จากมุมมองของฉันมันเกี่ยวข้องอย่างใกล้ชิดกับประเพณีUITableViewCellซึ่งบางครั้งก็ต้องมีส่วนควบคุมด้วย
นอกจากนี้ยังเป็นที่น่าสังเกตว่าคำตอบนี้เป็นวิธีแก้ปัญหาที่เฉพาะเจาะจงมาก สร้างปลายปากกาหนึ่งอันที่สามารถสร้างอินสแตนซ์ได้หลายครั้งในมุมมองเดียวกับที่วางไว้บนกระดานเรื่องราว ตัวอย่างเช่นคุณสามารถนึกภาพตัวจับเวลาทั้งหมดหกตัวบนหน้าจอ iPad พร้อมกันได้อย่างง่ายดาย หากคุณต้องการเพียงระบุมุมมองสำหรับตัวควบคุมมุมมองที่จะต้องใช้หลาย ๆ ครั้งในแอปพลิเคชันของคุณโซลูชันที่ jyavenard ให้ไว้สำหรับคำถามนี้เกือบจะเป็นทางออกที่ดีกว่าสำหรับคุณ