如何从UITableViewCell推送新的控制器

时间:2014-04-04 15:32:01

标签: ios iphone rubymotion

我有两节课。一个是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)

1 个答案:

答案 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];
}