如何使用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程应如下所示:
- 查找button被单击的单元格的索引path
- 获取与该indexPath对应的cellSight对象
- 使用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动作调用委托方法。 在cellForRowAtIndexPath
, delegate
您的单元的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]; }
您应该在“自定义表格视图”单元格中添加方法。
- 使用自定义表格单元格时,“无法识别的select器发送到实例”
- UITableView点击一个项目打开一个新的屏幕/视图/活动
- 如何select另一个表行时将自定义图标删除到UITableViewCellAccessoryCheckmark
- 具有两个自定义单元(多个标识符)的UITableView
- UITableView部分中的iOS7最后一个单元强制使用全宽分隔符
- 如何在iOS中单击UIButton时将项目插入UITableView
- 在UITableView中从networking加载图像的更有效的方法是什么?
- 如何使浏览器在ios中滚动
- 如何显示button上的TableView(如下拉列表)在iPhone中单击?