UIButton внутри подкласса UITableViewCell должен вызвать метод parent - PullRequest
8 голосов
/ 22 декабря 2010

Извините, если там уже есть ответ, но я не смог его найти.

У меня есть следующие настройки: MainViewController, который имеет большой UITableView и CustomTableViewCell, который является подклассом UITableViewCell. Каждый экземпляр CustomTableViewCell имеет UIButton, добавленный к его представлению содержимого (все сделано программно).

Когда кнопка нажата в данной ячейке, я бы хотел, чтобы она вызывала метод buttonPressed: в MainViewController и, что еще лучше, сообщала мне об индексе indexPath.section для ячейки, содержащей нажатую кнопку.

CustomTableViewCell не имеет файла пера, все сделано программно. В CustomTableViewCell.h я заявляю:

    UIButton *mybutton;

Хотя я не сохраняю (нет @property, @synthesize) его. Метод init для CustomTableViewCell.m выглядит следующим образом:

    myButton = [[UIButton alloc] init];
    [myButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventValueChanged];
    [[self contentView] addSubview:myButton];
    [myButton release];

но я хочу вместо этого вызвать метод "buttonPressed:", который находится в родительском представлении. Уже несколько часов хакнул, так что я был бы благодарен, если бы кто-нибудь избавил меня от моей собственной глупости. Спасибо!

1 Ответ

16 голосов
/ 22 декабря 2010

Тогда вы идете с шаблоном делегата!

Определите протокол, который будет уважать ваш контроллер, и делегата типа id в вашей ячейке. Не забудьте назначить этот делегат для каждой ячейки, создаваемой вашим контроллером.

Протокол:

@protocol MyProtocol
-(void)customCell:(MyCustomCell*)cell buttonClicked:(id)button;
@end

Свойство в интерфейсе вашей ячейки:

@interface MyCustomCell : UITableViewCell ...
...
   id<MyProtocol> _delegate;
...
   @property (nonatomic, assign) id<MyProtocol> delegate;
...
@end

Синтезируйте вашу собственность с помощью:

@synthesize delegate = _delegate;

Реализация делагата в вашем контроллере:

@interface MyCustomContoller : UIViewController<MyProtocol>

Установить делегата при создании ваших ячеек (из вашего контроллера)

cell.delegate = self

Затем из метода, вызываемого в вашей ячейке при нажатии кнопки:

-(void) buttonClicked:(id)sender {
[self.delegate customCell:self buttonClicked:sender];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...