пользовательские свойства для UIButton (iphone SDK) - PullRequest
1 голос
/ 08 сентября 2010

Я создал подкласс для UIButton и надеялся передать ему пользовательское свойство. Тем не менее, это не работает, и с тех пор я прочитал, что создание подкласса UIButton не очень хорошая идея.

Мой вопрос: как назначить пользовательское свойство кнопке? Я создаю кнопку, которая находится в заголовке сгруппированной таблицы. Я хочу перейти к этой кнопке номер раздела. Я сделал это успешно с UISwitch в каждой строке, но не могу использовать тот же метод для UIButton.

Так я создаю кнопку

MattsButtonClass *button = [MattsButtonClass buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(240, 15, 45, 30);
button.MFsectionNo = section; //this would be 1, 2 etc
//etc

Так как же я на самом деле это делаю? вы увидите, что у моего UIbutton есть подкласс, который выглядит следующим образом

//.h file
@interface MattsButtonClass : UIButton {
    int MFsectionNo;
}

@property (nonatomic) int MFsectionNo;

@end

//.m file
@implementation MattsButtonClass

@synthesize MFsectionNo;


@end

Ошибка на вышеупомянутом

-[UIRoundedRectButton MFsectionNo:]: unrecognized selector sent to instance 0x5673650
2010-09-07 22:41:39.751 demo4[67445:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UIRoundedRectButton MFsectionNo:]: unrecognized selector sent to instance 0x5673650'

Что я пытаюсь сделать невозможным? Спасибо за любую помощь ...

Ответы [ 3 ]

5 голосов
/ 08 сентября 2010

Вероятно, вы можете просто использовать свойство tag UIButton для хранения номера вашего раздела (возможно, со смещением, поскольку tag по умолчанию равно 0)

2 голосов
/ 08 сентября 2010

Это невозможно, потому что вы используете вызов функции:

[MattsButtonClass buttonWithType:UIButtonTypeCustom]

Это сообщение вернет UIButton , а не MattsButtonClass. Вот почему свойство не существует в возвращаемом объекте. Это затрудняет подкласс UIButton. Однако вы можете достичь желаемой функции следующим образом:

MattsButtonClass *button = [[MattsButtonClass alloc] initWithFrame:CGRectMake(240, 15, 45, 30)];
button.MFsectionNo = section;
0 голосов
/ 08 сентября 2010

Может быть, сохранить массив, который имеет ссылки на кнопки в заголовке каждого раздела?

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIButton *myButton = [[UIButton alloc] init];
    [myButton addTarget:self action:@selector(myButton_touchUpInside:) forControlEvents:UIControlEventTouchUpInside];

    // previously defined as an instance variable of your viewcontroller
    // NSMutableArray *sectionHeaderButtons;
    [sectionHeaderButtons insertObject:myButton atIndex:section];
}

Затем в обработчике события TouchUpInside кнопки:

- (void)myButton_touchUpInside:(id)sender
{
    int i;
    for (i = 0; i < [sectionHeaderButtons count]; i++)
    {
        if ([sectionHeaderButtons objectAtIndex:i] == sender)
            break; // now you know what section index was touched
    }
}

Если индекс раздела нажатой кнопки - это то, что вам нужно, это должно сработать. Однако это не оптимально, если:

  1. Вы перестраиваете разделы TableView, или
  2. У вас много разделов

Надеюсь, это поможет.

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