如何使用button操作(带参数)从自定义UITableViewCell中推送视图

我在自定义单元格中添加了一个button。 它推动了一个观点。 我为CustomTableViewCell.h上的button创build了属性

@property (weak, nonatomic) IBOutlet UIButton *selectedMapButton; 

我想使用selectedMapButton在TableViewController.m上推视图我试过这个代码,但是有些东西是不正确的。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *cord = cellSight[@"S_Coodinates"]; [cell.selectedMapButton addTarget:self action:@selector(sightMapButton:cord) forControlEvents:UIControlEventTouchUpInside]; //When I call sightMapButton method. It gives an error return cell; } - (void)sightMapButton: (NSString *)withCoordinates { TOCGSightseeingMapKitViewController *mapKitController = [[TOCGSightseeingMapKitViewController alloc] init]; mapKitController.sightCoordinates = withCoordinates; [self.navigationController pushViewController:mapKitController animated:YES]; } 

我该如何解决? 谢谢。

你不能指定你自己的参数button动作处理程序。 其具有1个参数的变体将接受“发送者”,即触发该动作的button。 您的工作stream程应如下所示:

  1. 查找button被单击的单元格的索引path
  2. 获取与该indexPath对应的cellSight对象
  3. 使用cellSite对象的信息填充您的控制器。

(有点伪)代码可能看起来像,假设你有一个SiteObjects的数组:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell = ... // create/init cell somehow [cell.selectedMapButton addTarget:self action:@selector(sightMapButton:) forControlEvents:UIControlEventTouchUpInside]; return cell; } - (void)sightMapButton: (UIButton *)sender { NSIndexPath *indexPath = ... // Find indexPath of button SiteObject cellSight = sitesArray[indexPath.row]; TOCGSightseeingMapKitViewController *mapKitController = [[TOCGSightseeingMapKitViewController alloc] init]; mapKitController.sightCoordinates = cellSight[@"S_Coodinates"]; [self.navigationController pushViewController:mapKitController animated:YES]; } 

如何find包含button的单元格的indexPath,例如在我的其他答案中可以find

委托/协议的替代方式(我最好的方法);

-创build一个“CustomCellDelegate”类。 (基类是NSObject)
-打开CustomCellDelegate.h并添加此代码;

 @protocol CustomCellDelegate <NSObject> - (void) uiTapButtonWithParameter:(NSString *)parameter; @end 

-closuresCustomCellDelegate.h
-打开CustomCell.h并添加此代码;

 #import "CustomCellDelegate" @interface CustomCell : UITableViewCell @property (nonatomic) id <CustomCellDelegate> delegate; 

-closuresCustomCell.h
-打开CustomCell.m并将代码添加到UIButton操作方法中;

 [_delegate uiTapButtonWithParameter:@"hello world!"]; 

-closuresCustomCell.m
-打开CustomViewController.h并添加此代码;

 @interface CustomViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, CategoryItemsCellDelegate> 

-closuresCustomViewController.h并打开CustomViewController.m
-添加这个代码;

 - ( NSInteger )tableView:( UITableView * )tableView numberOfRowsInSection:( NSInteger )section; { return 20; } - ( UITableViewCell * )tableView:( UITableView * )tableView cellForRowAtIndexPath:( NSIndexPath * )indexPath; { CategoryItemsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"]; cell.delegate = self; return cell; } - (void) uiTapButtonWithParameter:(NSString *)parameter{ NSLog(@"%@",parameter) } 

Mertkardeşimdelegate ve protocol endoğruçözümolacaktır;)

在你的自定义单元类中为button添加action ,并定义一个协议(委托)从button动作调用委托方法。 在cellForRowAtIndexPathdelegate您的单元的delegate设置为self并实现委托方法。 让我知道你是否有任何疑问。

我想问题是在@select器(sightMapButton:线),这是用来检索方法的地址。 很可能你不允许在这里传递论据。

作为findbutton被单击的单元格的索引path的替代方法:您可以inheritanceUIButton并将所需的信息作为属性添加到它。 然后你可以按照弗拉基米尔的build议去做,并且在把它投射到你的Button类之后,从发送者那里得到你的线索。

从发布的代码中可以看出,“单元格”设置正确。 你可以在这个地方添加代码吗? 你得到的错误是什么?

我认为最大的问题是你似乎误解了button目标的工作方式。 当目标被调用时,你不会得到传递给select器的'coord'的值。 您需要将其存储在某个地方,然后在调用目标select器时访问它。 您可以传递给您的目标select器的唯一参数是button本身。

弗拉基米尔的答案正确工作,我试了这个。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell.selectedMapButton.tag = indexPath.row; [cell.selectedMapButton addTarget:self action:@selector(sightMapButton:) forControlEvents:UIControlEventTouchUpInside]; } - (void)sightMapButton:(UIButton *)sender { TOCGSightseeingMapKitViewController *mapKitController = [[TOCGSightseeingMapKitViewController alloc] init]; mapKitController.sightCoordinate = self.sights[sender.tag][@"S_Coordinates"]; [self.navigationController pushViewController:mapKitController animated:YES]; } 

这也是工程。

  • 我们可以使用块来获取cellIndexPath。
  • 而不是使用CellDelegate来调用button动作块将是更好的select。

@interface WACustomCell:UITableViewCell

 @property(readwrite,copy)void (^cellCallBackMethod)(NSInteger rowIndexPath); -(IBAction)buttonTappedFromCell:(id)sender; @end 
  @implementation WACustomCell @synthesize cellCallBackMethod; -(IBAction)buttonTappedFromCell:(id)sender{ self.cellCallBackMethod(0); //any value can be given as we will retrive this value from CellForRowAtIndex method } 

在视图控制器

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ cel = .... cell.cellCallBackMethod = ^(NSInteger cellIndex){ [self cellButtonTappedFromCellWithIndex:cellIndex]; }; return cell; } -(void)cellButtonTappedFromCellWithIndex:(NSInteger )cellIndex{ SiteObject cellSight = sitesArray[cellIndex]; TOCGSightseeingMapKitViewController *mapKitController = [[TOCGSightseeingMapKitViewController alloc] init]; mapKitController.sightCoordinates = cellSight[@"S_Coodinates"]; [self.navigationController pushViewController:mapKitController animated:YES]; } 

您应该在“自定义表格视图”单元格中添加方法。