Получение свойства пользовательской кнопки в Objective-C - PullRequest
0 голосов
/ 07 июня 2011

Я создал пользовательскую кнопку с именем TaskUIButton, которая наследуется от UIButton. Единственное отличие, которое я имею сейчас, - это свойство "va".

Вот интерфейс

// TaskUIButton.h
@interface TaskUIButton : UIButton 
{
NSString *va;
}
@property(nonatomic, retain) NSString *va;
@end

И файл реализации

//TaskUIButton.m
@implementation TaskUIButton
@synthesize va;

@end

Теперь у меня есть действие, которое я использую, и которое я хочу использовать для установки и получения свойства va кнопки (разумеется, только для тестирования / экспериментов).

Здесь действие кнопки

- (IBAction)setAndRetrieveVa:(id)sender{

TaskUIButton *imaButton = [TaskUIButton buttonWithType:UIButtonTypeRoundedRect];
imaButton.va = @"please work";
NSLog(@"%@", imaButton.va);
}

После активации действия setAndRetrieveVa: мое приложение вылетает с:

-[UIRoundedRectButton setVa:]: unrecognized selector sent to instance 0x4b3a5a0

Я уверен, что это глупая ошибка с моей стороны, но я уже давно нахожусь в этом и хотел бы немного постичь!

Спасибо!

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Вы получаете это, потому что buttonWithType: возвращает новый объект, который является UIRoundedRectButton объектом, который является подклассом UIButton. Вы не можете изменить это поведение метода, если не переопределите, но вряд ли получите то, что хотите. Вы должны принять alloc-init подход.

Использование ассоциативных ссылок

Вам нужно будет #import <Foundation/NSObjCRuntime.h>, чтобы это сработало.

Для установки

objc_setAssociatedObject(button, "va", @"This is the string", OBJC_ASSOCIATION_RETAIN);

И чтобы извлечь,

NSString * va = (NSString *)objc_getAssociatedObject(button, "va");

Таким образом, вам не нужно создавать подклассы UIButton.

0 голосов
/ 08 июня 2011

В итоге я просто расширил UIControl ... оказалось намного проще:)

- (IBAction)setAndRetrieveVa:(id)sender{

TaskUIButton *newTaskButton = [[TaskUIButton alloc] initWithFrame:CGRectMake(29.0, (76.0+ (88*taskCounter)), 692, 80.0)];
[newTaskButton addTarget:self action:@selector(function1:)forControlEvents:UIControlEventTouchUpInside];
[newTaskButton addTarget:self action:@selector(function2:) forControlEvents:UIControlEventTouchDragExit];
[newTaskButton setBackgroundColor:[UIColor grayColor]];
[newTaskButton setTitle:@"0" forState:UIControlStateNormal];
[newTaskButton setVa:@"please work!"];
NSLog(@"%@", newTaskButton.va);
}

А для выделения кликов я всегда могу добавить функцию, которая меняет цвет фона при касании и переключает цвет обратно при касании. Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...