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