我有一个UITableViewController
,其中包含我使用自己的子类自定义的自定义单元格。
在这个子类中,我添加了一个按钮,我想将视图推入导航控制器的堆栈中。我不知道如何做到这一点,因为我不知道如何从我的自定义单元格访问导航控制器。
有什么想法吗?
答案 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(或您可以访问视图控制器的任何其他位置)中实现委托。然后如上所述将委托传递给单元格,并在单击按钮时从单元格调用回调函数。