Що ж, щоб відповісти концептуально, ваш таймер, швидше за все, повинен бути підкласом UIViewзамість NSObject.
Щоб створити екземпляр свого таймера в IB, просто перетягніть UIViewйого на подання контролера перегляду та встановіть його клас на ім'я класу вашого таймера.

Запам’ятайте #importсвій клас таймера в контролері перегляду.
Редагування: для дизайну ІБ (для створення коду див. Історію редагування)
Я взагалі не дуже знайомий із раскадровкой, але я знаю, що ви можете сконструювати свій інтерфейс в IB за допомогою .xibфайлу, який майже ідентичний використанню версії розкадровки; Ви навіть можете мати змогу копіювати та вставляти свої представлення в цілому з наявного інтерфейсу у .xibфайл.
Щоб перевірити це, я створив нову порожню .xibназву "MyCustomTimerView.xib". Потім я додав перегляд, а до цього додав мітку та дві кнопки. Як так:

Я створив новий підклас класу об’єктивного класу C UIViewпід назвою "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 і встановлює властивість "Власник файлу" для себе. Ми витягуємо перший об’єкт з масиву, і це кореневий вигляд Nib. Ми додаємо подання як підвід, і Voila це на екрані.
Очевидно, що це просто змінює колір фону ярлика при натисканні кнопок, але цей приклад повинен добре допомогти вам.
Примітки на основі коментарів:
Варто зазначити, що якщо у вас виникають нескінченні проблеми з рекурсією, ви, ймовірно, пропустили тонкий трюк цього рішення. Це не те, що ти думаєш, що робить. Погляд, розміщений у дошці розкадрування, не проглядається, але натомість завантажує інший вигляд у вигляді підзагляду. Огляд, який він завантажує, - це вид, який визначено в ручку. "Власник файлу" в ручці - це небачене уявлення. Прикольна частина полягає в тому, що цей небачений вигляд все ще є класом Objective-C, який може використовуватися як контролер подання видів для подання, яке він вводить з кнопки. Наприклад, IBActionметоди в MyCustomTimerкласі - це те, чого ви очікували б більше в контролері перегляду, ніж у перегляді.
Як зауваження, деякі можуть стверджувати, що це порушується, MVCі я дещо згоден. З моєї точки зору, це більш тісно пов'язане зі звичаєм UITableViewCell, який також іноді має бути частиною контролера.
Варто також зазначити, що ця відповідь мала забезпечити дуже конкретне рішення; створіть одну підказку, яку можна кілька разів інстанціювати на одному і тому ж представленні, як викладене на дошці розкадрувань. Наприклад, ви могли легко уявити собі шість таких таймерів, усі на екрані iPad за один раз. Якщо вам потрібно лише вказати подання для контролера перегляду, який повинен використовуватися кілька разів у вашій програмі, тоді рішення, яке надає jyavenard для цього питання , майже напевно є кращим рішенням для вас.