道歉,如果已经有答案,但我找不到。
我有以下设置:MainViewController有一个很大的UITableView和CustomTableViewCell,它是UITableViewCell的子类。 CustomTableViewCell的每个实例都在其内容视图中添加了一个UIButton(所有这些都以编程方式完成)。
当在给定单元格中按下按钮时,我希望它在MainViewController中调用buttonPressed:方法,更好的是,告诉我包含按下按钮的单元格的indexPath.section。
CustomTableViewCell没有nib文件,都是以编程方式完成的。在CustomTableViewCell.h中,我声明:
UIButton *mybutton;
虽然我没有保留(没有@property,@synthesize)。 CustomTableViewCell.m的init方法如下所示:
myButton = [[UIButton alloc] init];
[myButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventValueChanged];
[[self contentView] addSubview:myButton];
[myButton release];
但是我想调用住在父视图中的“buttonPressed:”方法。一直在偷偷摸摸几个小时,所以如果有人能饶恕我自己的愚蠢,我将不胜感激。谢谢!
答案 0 :(得分:16)
然后你去代理模式!
定义控制器将遵守的协议以及您的单元格上的类型id的委托。不要忘记为您使用控制器创建的每个单元格分配该委托。
协议:
@protocol MyProtocol
-(void)customCell:(MyCustomCell*)cell buttonClicked:(id)button;
@end
您的手机界面中的属性:
@interface MyCustomCell : UITableViewCell ...
...
id<MyProtocol> _delegate;
...
@property (nonatomic, assign) id<MyProtocol> delegate;
...
@end
使用以下命令合成您的属性:
@synthesize delegate = _delegate;
在你的控制器中实现delagate:
@interface MyCustomContoller : UIViewController<MyProtocol>
在创建单元格时(从控制器)设置委托
cell.delegate = self
然后单击按钮时从单元格中调用的方法:
-(void) buttonClicked:(id)sender {
[self.delegate customCell:self buttonClicked:sender];
}