Để trả lời về mặt khái niệm, bộ đếm thời gian của bạn có thể phải là một lớp con của UIView
thay vì NSObject
.
Để khởi tạo một phiên bản bộ đếm thời gian của bạn trong IB, chỉ cần kéo ra UIView
thả nó trên khung nhìn của bộ điều khiển chế độ xem của bạn và đặt lớp của nó thành tên lớp của bộ hẹn giờ của bạn.
Nhớ #import
lớp hẹn giờ của bạn trong bộ điều khiển chế độ xem của bạn.
Chỉnh sửa: cho thiết kế IB (đối với phần tạo mã, hãy xem lịch sử sửa đổi)
Tôi không quen lắm với bảng phân cảnh, nhưng tôi biết rằng bạn có thể xây dựng giao diện của mình trong IB bằng cách sử dụng .xib
tệp gần giống với việc sử dụng phiên bản bảng phân cảnh; Bạn thậm chí có thể sao chép và dán toàn bộ chế độ xem của mình từ giao diện hiện có vào .xib
tệp.
Để kiểm tra điều này, tôi đã tạo một khoảng trống mới .xib
có tên "MyCustomTimerView.xib". Sau đó, tôi thêm một chế độ xem, và thêm một nhãn và hai nút. Như vậy:
Tôi đã tạo một lớp con lớp mục tiêu-C mới UIView
có tên "MyCustomTimer". Trong của tôi, .xib
tôi đặt lớp Chủ sở hữu tệp của tôi là MyCustomTimer . Giờ đây, tôi có thể tự do kết nối các hành động và cửa hàng giống như bất kỳ chế độ xem / bộ điều khiển nào khác. Kết quả.h
trông như thế này:
@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
Rào cản duy nhất còn lại để nhảy là nhận được điều này .xib
trên UIView
lớp con của tôi . Sử dụng một .xib
cắt giảm đáng kể thiết lập cần thiết. Và vì bạn đang sử dụng bảng phân cảnh để tải bộ hẹn giờ mà chúng tôi biết -(id)initWithCoder:
là bộ khởi tạo duy nhất sẽ được gọi. Vì vậy, đây là tệp triển khai trông như thế nào:
#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
Phương thức có tên loadNibNamed:owner:options:
thực hiện chính xác những gì nó giống như nó. Nó tải Nib và đặt thuộc tính "Chủ sở hữu tệp" thành chính nó. Chúng tôi trích xuất đối tượng đầu tiên trong mảng và đó là chế độ xem gốc của Nib. Chúng tôi thêm chế độ xem dưới dạng chế độ xem phụ và Thì đó là chế độ xem trên màn hình.
Rõ ràng là điều này chỉ thay đổi màu nền của nhãn khi các nút được nhấn, nhưng ví dụ này sẽ giúp bạn thực hiện tốt.
Ghi chú dựa trên nhận xét:
Cần lưu ý rằng nếu bạn đang gặp vấn đề đệ quy vô hạn, bạn có thể đã bỏ lỡ mẹo nhỏ của giải pháp này. Nó không làm những gì bạn nghĩ nó đang làm. Chế độ xem được đưa vào bảng phân cảnh sẽ không được nhìn thấy mà thay vào đó sẽ tải một chế độ xem khác làm chế độ xem phụ. Dạng xem mà nó tải là dạng xem được xác định trong nib. "Chủ sở hữu của tệp" trong nib là chế độ xem không nhìn thấy. Phần thú vị là chế độ xem không nhìn thấy này vẫn là một lớp Objective-C có thể được sử dụng như một bộ điều khiển chế độ xem các loại cho chế độ xem mà nó mang lại từ ngòi. Ví dụ các IBAction
phương pháp trongMyCustomTimer
lớp là thứ mà bạn mong đợi ở bộ điều khiển chế độ xem hơn là trong một chế độ xem.
Như một lưu ý nhỏ, một số người có thể tranh luận rằng điều này không đúng MVC
và tôi đồng ý phần nào. Theo quan điểm của tôi, nó liên quan chặt chẽ hơn đến một tùy chỉnh UITableViewCell
, đôi khi cũng phải là bộ điều khiển một phần.
Cũng cần lưu ý rằng câu trả lời này đã cung cấp một giải pháp rất cụ thể; tạo một ngòi có thể được khởi tạo nhiều lần trên cùng một chế độ xem như được trình bày trên bảng phân cảnh. Ví dụ, bạn có thể dễ dàng hình dung sáu bộ hẹn giờ này cùng một lúc trên màn hình iPad. Nếu bạn chỉ cần chỉ định chế độ xem cho bộ điều khiển chế độ xem được sử dụng nhiều lần trên ứng dụng của mình thì giải pháp do jyavenard cung cấp cho câu hỏi này gần như chắc chắn là giải pháp tốt hơn cho bạn.