2013-02-12 5 views
0

Я пытаюсь разбить некоторые из моих «супер объектов» на более управляемые классы, которые имеют единую (или, по крайней мере, ограниченную) ответственность.Создание экземпляра экземпляра другого класса

Одна проблема, с которой я только что столкнулся, делает объект конкретного экземпляра 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. 

ответ

1

Это не то, как инициализация работает в какао. Пожалуйста, прочитайте "Initialization" в руководстве по основным компетенциям Cocoa.

Ваш объект уже выделен, когда этот метод init запущен.Вы не должны переназначать указатель self на другое выделение.

Ваш класс должен сначала вызвать свой инициализатор суперкласса self = [super initWithWhatever:obj];, а затем настроить его собственные свойства.

+0

Спасибо, я это понимаю. То, что я пытаюсь сделать, - это выяснить правильный способ для MyClass иметь тип UIBarButtonItem, и он инициализирует собственный пользовательский вид, когда создается экземпляр его. Поверьте мне, я понимаю, насколько этот вопрос кажется простым (что, вероятно, почему я не вижу чего-то очевидного). –

+0

Попробуйте заменить 'self = [[UIBarButtonItem alloc] initWithCustomView: button];' с '[self setCustomView: button];' –

+0

Это сработало отлично. Я думал, что '[super init]' может оставить его в некотором частично инициализированном состоянии, но он работает. Благодаря! –

1

мне кажется, что вы хотите расширить UIBarButtonItem, не создать экземпляр этого в методе init. Попробуйте изменить объявление класса (в .h файле вашего класса) от этого:

@interface MyClass : NSObject 

к этому:

@interface MyClass : UIBarButtonItem 

Тогда просто вернуться self в методе init. Значение self на значение, как правило, плохая идея.

Если вы не знаете, что здесь происходит, вы создаете подкласс UIBarButtonItem. Это позволяет вашему подклассу расширять функциональность суперкласса. Если вы смущены, вы должны взглянуть на наследование подкласса/класса в объектно-ориентированных языках, чтобы понять, что происходит. This guide Документирует, как работают классы в Objective-C.

+0

Да, мое объявление уже для «MyClass: UIBarButtonItem». Проблема в том, что это не просто расширение типа UIBarButtonItem, а конкретное: initWithCustomView. Вот что я не знаю, как это сделать. Если бы я использовал [[MyClass alloc] initWithCustomView:], это не проблема. Тем не менее, я хочу, чтобы этот пользовательский вид содержался внутри и контролировался MyClass. –

+0

@Adam Если вы подклассифицируете 'UIBarButtonItem', вы, вероятно, можете вообще избегать« initWithCustomView: »и переместить логику своего пользовательского представления в сам подкласс. Но если вы действительно хотите его использовать, вы можете изменить 'if (self = [super init]) {' segment to 'if (self = [super initWithCustomView: myView]) {'. –

+0

Я не могу проверить это прямо сейчас. Однако для 'UIBarButtonItem' нет простого' init'. Поэтому, если бы я должен был создать экземпляр MyClass, я не уверен, что будет для состояния возвращенного '[super init]'. Хотя 'UIBarButtonItem' имеет свойство для пользовательского представления, у меня есть догадка о том, что возвращенный' [super init] 'может находиться в каком-то бесполезном состоянии (поскольку он не был инициализирован одним из пяти стандартных значений, приведенных в ссылке на класс). Однако, возможно, нет. Я проверю это. –

Смежные вопросы