我有两节课。一个是ItemController
(扩展UITableViewController
),另一个是ItemCell
(扩展'UITableViewCell')。
点击每个单元格后,我从ItemController
的{{1}}内推出一个新控制器。
此外,在didSelectRowAtIndexPath
中,我为每个单元格提供了几个不同ItemCell
的小按钮。当点击任何这些按钮时,我想推一个新的控制器。我怎样才能做到这一点?
tag
的 self.navigationController.pushViewController
不起作用,因为它没有ItemCell
我更愿意在RubyMotion中看到一个解决方案,但如果没有,那也很好:)
修改
我已经读过navigationController
可以解决方案,但我不确定如何实现它。这就是我所做的
ItemController:
delegate
ItemCell:
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
但是我收到了错误
item_controller.rb:114:在ItemCell的
class ItemCell < UITableViewCell attr_accessor :delegate def initWithSomething(delegate) @delegate = delegate end ...use @delegate to push the new controller end
initWithSomething'中:Class (NoMethodError)
答案 0 :(得分:1)
一般的想法是,你的单元格应该告诉你的视图控制器发生了什么事情,并且视频控制器决定推送另一个视图控制器。
您可以使用委托设计模式执行此操作:
ItemCell
具有符合协议的delegate
属性。例如
@class ItemCell
@protocol ItemCellDelegate
- (void)itemCellDidClickSubmitButton:(ItemCell *)cell;
@end
@interface ItemCell
@property (nonatomic, weak) id<ItemCellDelegate> delegate
...
@end
在tableView:cellForRowAtIndexPath:
中,您将控制器设置为单元格委托(显然视图控制器应符合ItemCellDelegate
):
cell.delegate = self
单元格上的按钮将触发单元格本身的IBAction,进而调用委托方法
- (IBAction)submitButtonTapped:(id)sender
{
id <ItemCellDelegate> delegate = self.delegate;
if ([delegate respondToSelector:@selector(itemCellDidClickSubmitButton:)]) {
[delegate itemCellDidClickSubmitButton:self];
}
}
显然在你的View Controller中你应该做的事情如下:
#pragma mark - ItemCellDelegate
- (void)itemCellDidClickSubmitButton:(ItemCell)cell
{
UIViewController *controller = // Create the view controller to push
[self.navigationController pushViewController:controller];
}