Как нажать новый контроллер из UITableViewCell

У меня есть два класса. Один для ItemController (расширяет UITableViewController), а другой - ItemCell (расширяет UITableViewCell).

Когда каждая ячейка нажата, я нажимаю новый контроллер из ItemController didSelectRowAtIndexPath.

Кроме того, в ItemCell у меня есть несколько маленьких кнопок с разными tag для каждой ячейки. При нажатии любой из этих кнопок я хочу нажать новый контроллер. Как я могу это сделать?

self.navigationController.pushViewController из ItemCell не работает, поскольку у него нет navigationController

Я бы предпочел увидеть решение в RubyMotion, но если нет, это тоже хорошо :)

редактировать

Я читал, что delegate может быть решением, но я не уверен, как его реализовать. Это то, что я сделал

ItemController:

def tableView(table_view, cellForRowAtIndexPath: index_path)
 data_row = self.data[index_path.row]
 cell = table_view.dequeueReusableCellWithIdentifier(CATEGORY_CELL_ID) || begin
 rmq.create(ItemCell.initWithSomething(self), :category_cell, reuse_identifier: CATEGORY_CELL_ID).get
 end
 cell.update(data_row)
 cell
 end

ItemCell:

class ItemCell < UITableViewCell

 attr_accessor :delegate
 def initWithSomething(delegate)
 @delegate = delegate
 end

 ...use @delegate to push the new controller
end

но я получаю сообщение об ошибке

item_controller.rb: 114: in tableView:cellForRowAtIndexPath:': undefined method initWithSomething' для ItemCell: Class (NoMethodError)

1 ответ

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

Вы можете сделать это с помощью шаблона проектирования делегата:

ItemCell имеет свойство delegate, соответствующее протоколу. Например

@class ItemCell
@protocol ItemCellDelegate
- (void)itemCellDidClickSubmitButton:(ItemCell *)cell;
@end

@interface ItemCell
@property (nonatomic, weak) id<itemcelldelegate> delegate
...
@end
</itemcelldelegate>

В tableView:cellForRowAtIndexPath: вы установите контроллер как делегат ячейки (очевидно, контроллер представления должен соответствовать ItemCellDelegate):

cell.delegate = self

Кнопка на вашей ячейке вызовет ******** на самой ячейке, которая, в свою очередь, вызовет метод делегирования

- (********)submitButtonTapped:(id)sender
{
 id <itemcelldelegate> delegate = self.delegate;
 if ([delegate respondToSelector:@selector(itemCellDidClickSubmitButton:)]) {
 [delegate itemCellDidClickSubmitButton:self];
 } 
}
</itemcelldelegate>

И, очевидно, в вашем контроллере просмотра вы должны сделать что-то вроде:

#pragma mark - ItemCellDelegate

- (void)itemCellDidClickSubmitButton:(ItemCell)cell
{
 UIViewController *controller = // Create the view controller to push
 [self.navigationController pushViewController:controller];
}

licensed under cc by-sa 3.0 with attribution.