Що ж, щоб відповісти концептуально, ваш таймер, швидше за все, повинен бути підкласом 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 для цього питання , майже напевно є кращим рішенням для вас.