在UICellView

时间:2016-02-12 11:45:02

标签: ios objective-c uitableview

我有自定义单元格UITableView。在单元格中,我有viewController中的按钮和方法(包含UITableView

我的按钮点击实现位于我的myCustomCell课程内。

问题是 - 从viewController调用myCustomCell方法的最简单方法是什么?

我想到了代表和NSNotificationCenter。但也许还有另一种方式。

修改

enter image description here

2 个答案:

答案 0 :(得分:4)

在myCustomCell.h中添加以下行

@protocol ButtonTapDelegate

- (void) buttonDidTap:(UIButton*) button;

@end

@property (nonatomic, weak) NSObject<ButtonTapDelegate> *vs_delegate;

-(void) buttonIsPressed;
我的myCustomCell.m

@synthesize vs_delegate;

-(void) buttonIsPressed:(UIButton*)button {

    if([delegate conformsToProtocol:@protocol(ButtonTapDelegate)] && [delegate respondsToSelector:@selector(buttonDidTap:)]) {
       [vs_delegate buttonDidTap:button];
    }
}

在viewController.h中

myViewController : UIViewController <ButtonTapDelegate>

在viewController.m中,在Method

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        [cell set.Vs_delegate:self];
        [cell.button setTag:indexPath.row];
        [cell.button addTarget:self action:@selector(buttonIsPressed) forControlEvents:UIControlEventTouchUpInside];
    [cell.button buttonIsPressed:indexPath.row];

将以下方法放在ViewController.m

- (void) buttonDidTap:(UIButton*) button {
 // You have index, by Button's tag.
}

答案 1 :(得分:1)

使用块执行此操作的最有效和最简洁的方法。

在您的单元格中声明阻止属性 TableViewCell CollectionViewCell

@property (nonatomic, copy) void(^buttonClickedAtIndexPath)(NSIndexPath *indexPath);

在单元格本身中声明按钮的操作,并在按钮单击事件中调用上面的块。

-(IBAction)buttonClicked:(id)sender {

  // get indexPath here, which will be indexPath of cell.
  // you need to set button's tag as indexPath.row

  if(self.buttonClickedAtIndexPath) {
    self.buttonClickedAtIndexPath (indexPath);
  }
}

在ViewController中

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

  TableViewCell *cell = // configure cell here.
  cell.button.tag = indexPath.row;
  cell.buttonClickedAtIndexPath = ^(NSIndexPath *indexPath){

   // you can do anything here. 
   // Call any method using self OR
   // perform segue

  }

}

如果你在TableViewCell中有CollectionView,那么同样适用。

  • 创建一个 MyCollectionViewCell UICollectionViewCell
  • 在MyCollectionViewCell中声明阻止属性。
  • 处理MyCollectionViewCell中的所有事件(包括collectionView的显示数据,委托,数据源)。
  • 点击按钮,从MyCollectionViewCell调用一个块。
  • TableViewCell 中声明 MyCollectionViewCell 的属性。
  • 在您的控制器的 cellForRowAtIndexPath 中执行类似的操作。

=============================================== =============

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

  TableViewCell *cell = // configure cell here.
  cell.mycollectionView.buttonClickedAtIndexPath = ^(NSIndexPath *indexPath){

   // you can do anything here. 
   // Call any method using self OR
   // perform segue

  }

}