如何从UITableViewCell推送视图

时间:2012-03-08 10:25:45

标签: objective-c ios uitableview

我有一个UITableViewController,其中包含我使用自己的子类自定义的自定义单元格。 在这个子类中,我添加了一个按钮,我想将视图推入导航控制器的堆栈中。我不知道如何做到这一点,因为我不知道如何从我的自定义单元格访问导航控制器。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

此处需要更多信息。什么类保存表,tableview委托是什么类?

在最简单的情况下,你在一个单独的班级工作。比它[self.navigationController pushViewController: xyz]

但是如果你有自己的子类UITableViewCells,那么你需要在cell类和viewcontroller之间进行通信。您可以通过在单元类或您自己的customCell委托中设置属性来完成此操作。

您还可以发送viewController正在侦听的通知([[NSNotificationCenter defaultCenter] postNotification: @"cellButtonTouchedNotification"])([[NSNotificationCenter defaultCenter] addListener: self target: @selector(...) name: @"cellButtonTouchedNotification"])。在这种情况下,您可以使用userInfo属性来记住触摸了哪个单元格。

另一种方法是使按钮可从外部访问(例如属性)。然后,您可以在tableViewDelegate的方法cellForRowAtIndexPath:中添加目标。水木清华。例如[myCustomCell.button addTarget: self selector: @selector(...)];您可以使用标记来标识行myCustomCell.button.tag = indexPath.row

答案 1 :(得分:5)

使用委托。这是一个简单的例子。

//.h
@protocol MyTableViewCellDelegate;

@interface MyTableViewCell : UITableViewCell

@property (assign, nonatomic) id <MyTableViewCellDelegate> delegate;

//your code here

@end

@protocol MyTableViewCellDelegate <NSObject>

@optional

- (void)delegateForCell:(MyTableViewCell *)cell;

@end

//.m
@implementation MyTableViewCell

@synthesize delegate = _delegate;

- (void)prepareForReuse {
    [super prepareForReuse];

    self.delegate = nil;
}

- (void)buttonAction {

    if ([self.delegate respondsToSelector:@selector(delegateForCell:)])
        [self.delegate delegateForCell:self];
}

@end

当您单击按钮时,您会向您的单元格的委托发送消息(例如,插入导航控制器的表格视图控制器)。

控制器

@implementation YourController

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   NSString *reuseIdentifier = @"MyCustomCell";
   MyTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier:reuseIdentifier];

   if (cell == nil)
       cell = [[[MyTableViewCell alloc] initWithMyArgument:someArgument reuseIdentifier:reuseIdentifier] autorelease];

    [cell setDelegate:self];

    // update your cell

    return cell;
}

- (void)delegateForCell:(MyTableViewCell *)cell {

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    // do your stuff

    [self.navigationController pushViewController:...];
}

@end

答案 2 :(得分:0)

在单元格中按住指向UITableViewController的指针。您可以在单元格的构造函数中传递它或稍后设置它。然后你可以在表视图控制器上调用pushViewController。

更美妙的解决方案是为你的单元格定义一个委托,比如ButtonCellDelegate有一个buttonClicked回调。您可以在UITableViewController(或您可以访问视图控制器的任何其他位置)中实现委托。然后如上所述将委托传递给单元格,并在单击按钮时从单元格调用回调函数。