Я пытаюсь разбить некоторые из моих «супер объектов» на более управляемые классы, которые имеют единую (или, по крайней мере, ограниченную) ответственность.Создание экземпляра экземпляра другого класса
Одна проблема, с которой я только что столкнулся, делает объект конкретного экземпляра UIBarButtonItem. В классе это в настоящее время я сначала определяю UIButton, а затем все изображения, которые выступают в качестве значков для этой кнопки в качестве подзонов (например, кнопка представляет доступ/управление к устройству, и я использую изображение кнопки, чтобы показать ток силового сигнала этого устройства). Также эта кнопка прослушивает NSNotifications из объекта устройства, чтобы отобразить изменение уровня сигнала, или если устройство отключается. И нажатие кнопки отправляет сообщение на устройство для отключения. Весь этот код отлично работает теперь как свойство RootViewController. Тем не менее, я хочу вытащить его в свой класс, так как кнопка разделяется несколькими классами, и она просто загромождает контроллер ненужными методами.
Я пробовал сделать отдельный класс с init, как показано ниже. Тем не менее, это не работает, так как сам, используемый для кнопки, - это не то же самое, что в конечном итоге создано [UIBarButtonItem alloc], и когда либо NSNotification, либо кнопка нажимают, пытайтесь отправить сообщение в селектор «self», , этот объект уже освобожден. Проблема в том, что я не уверен, как создать объект (как определено классом), который является всего лишь экземпляром другого класса, в отличие от свойства объекта (как в настоящее время для RootViewController).
Редактировать и дополнительное объяснение моей проблемы
MyClass в настоящее время подкласс UIBarButtonItem. Однако я не пытаюсь использовать его так: [[MyClass alloc] initWithCustomView:]. Я хочу [MyClass alloc] init] сам по себе полностью создать пользовательский вид - другими словами, весь смысл этого класса состоит в том, чтобы полностью содержать все, что необходимо, чтобы эта кнопка создавала себя, управляла своими подзонами и предпринимала соответствующие действия когда он нажат. (Я мог бы легко сделать MyClass NSObject общедоступным методом, например [MyClass setupButton] и общедоступным свойством типа UIBarButtonItem. Однако я думаю, что это выглядит неправильно, потому что тогда класс должен только создать кнопку, но это не кнопка сама по себе.)
@interface MyClass : UIBarButtonItem
@end
@implementation MyClass
- (id)init {
if (self = [super init]) {
UIImage *defaultButton = [[UIImage imageNamed:@"...
UIImage *defaultButtonPressed = [[UIImage imageNamed:@"....
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 30)];
[button setBackgroundImage:defaultButton forState:UIControlStateNormal];
[button setBackgroundImage:defaultButtonPressed forState:UIControlStateHighlighted];
[button addTarget:self action:@selector(deviceButtonPressed) forControlEvents:UIControlEventTouchUpInside];
//Then several UIImageViews that are added as subviews of the button, initially hidden
//Then set up the NSNotification listener
//Finally
self = [[UIBarButtonItem alloc] initWithCustomView:button];
}
return self;
}
//Then several functions to handle hiding and unhiding the subviews depending on the received device notifications, and a function to handle the button press and sending the message back to the device.
Спасибо, я это понимаю. То, что я пытаюсь сделать, - это выяснить правильный способ для MyClass иметь тип UIBarButtonItem, и он инициализирует собственный пользовательский вид, когда создается экземпляр его. Поверьте мне, я понимаю, насколько этот вопрос кажется простым (что, вероятно, почему я не вижу чего-то очевидного). –
Попробуйте заменить 'self = [[UIBarButtonItem alloc] initWithCustomView: button];' с '[self setCustomView: button];' –
Это сработало отлично. Я думал, что '[super init]' может оставить его в некотором частично инициализированном состоянии, но он работает. Благодаря! –