5

我有一个包含 UITableView 的视图。这个 UITableView 的单元格是在 Interface Builder 中创建的,以便拥有不同类型的单元格。因此,每个按钮的操作都在单元类中进行管理,如下所示。

- 我的 UITableView 包含不同类型的单元格:

在此处输入图像描述

- 我的第一类单元格的头文件(“CellTypeOne.h”)

@interface CellTypeOne : UITableViewCell
{
}

- (IBAction)actionForFirstButton:(id)sender;
- (IBAction)actionForSecondButton:(id)sender;
- (IBAction)actionForThirdButton:(id)sender;
- (IBAction)actionForFourthButton:(id)sender;

- 我的类的头文件类型二单元格(“CellTypeTwo.h”)

@interface CellTypeTwo : UITableViewCell
{
}

- (IBAction)actionForTheUniqueButton:(id)sender;

- 包含我的表格视图的视图(“ViewContainingMyTableView.h”):

@interface ViewContainingMyTableView : UIViewController <UITableViewDelegate, UITableViewDataSource>
{
    UITableView *myTBV;
}

@property (retain, nonatomic) IBOutlet UITableView *myTBV;

@end

这是我想做的事情:

例如,当我单击第一个单元格中的第一个按钮时,我希望能够显示“当前”单元格的 indexPath。

例如,我希望在以下情况下输出以下内容:

  • 我单击第一个单元格中的第一个按钮:0
  • 我单击第一个单元格中的第三个按钮:0
  • 我单击第二个单元格中的第一个也是唯一的按钮:1
  • ETC...
4

5 回答 5

10

因为您正在使用自定义单元格,我认为您还需要处理选择,因为您正在触摸自定义单元格内的按钮而不是单元格本身,因此不会触发 tableview 委托方法,正如我在您的自定义单元格中所说的那样放置一个委托方法例如在您的自定义单元格中

在你CellTypeOne.h添加这个

//@class CellTypeOne; //if u want t pass cell to controller
@protocol TouchDelegateForCell1 <NSObject> //this delegate is fired each time you clicked the cell
 - (void)touchedTheCell:(UIButton *)button;
 //- (void) touchedTheCell:(CellTypeOne *)cell; //if u want t send entire cell this may give error add `@class CellTypeOne;` at the beginning  
@end

@interface CellTypeOne : UITableViewCell
{

}
@property(nonatomic, assign)id<TouchDelegateForCell1> delegate; //defining the delegate
- (IBAction)actionForFirstButton:(id)sender;
- (IBAction)actionForSecondButton:(id)sender;
- (IBAction)actionForThirdButton:(id)sender;
- (IBAction)actionForFourthButton:(id)sender;

在你的CellTypeOne.m文件中

@synthesize delegate; //synthesize the delegate 

- (IBAction)actionForFirstButton:(UIButton *)sender 
{ 
   //add this condition to all the actions becz u need to get the index path of tapped cell contains the button
    if([self.delegate respondsToSelector:@selector(touchedTheCell:)])
     {
        [self.delegate touchedTheCell:sender];
        //or u can send the whole cell itself
        //for example for passing the cell itself
        //[self.delegate touchedTheCell:self]; //while at the defining the delegate u must change the sender type to - (void)touchedTheCell:(CellTypeOne *)myCell; if it shows any error  in the defining of the delegate add "@class CellTypeOne;" above the defying the delegate
    }
}

在你的ViewContainingMyTableView.h

 @interface ViewContainingMyTableView : UIViewController <UITableViewDelegate, UITableViewDataSource ,TouchDelegateForCell1> //confirms to custom delegate like table  delegates
 {
    UITableView *myTBV;
 }

 @property (retain, nonatomic) IBOutlet UITableView *myTBV;

 @end

并在ViewContainingMyTableView.m文件中

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{  
   //during the creating the custom cell 
   CellTypeOne *cell1 = [self.aTableView dequeueReusableCellWithIdentifier:@"cell"];
   if(cell1 == nil)
   { 
     cell1 = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
   }
     cell.delegate = self; //should set the delegate to self otherwise delegate methods does not called this step is important
}

//now implement the delegate method , in this method u can get the indexpath of selected cell 

- (void)touchedTheCell:(UIButton *)button
 {
    NSIndexPath *indexPath = [self.aTableView indexPathForCell:(UITableViewCell *)button.superview];
    NSLog(@"%@",indexPath.description);

 }
 /* if u pass the cell itself then the delegate method would be like below
- (void)touchedTheCell:(CellTypeOne *)myCell
 {
    NSIndexPath *indexPath = [self.aTableView indexPathForCell:myCell];//directly get the cell's index path
    //now by using the tag or properties, whatever u can access the contents of the cell
    UIButton *myButton = [myCell.contentView viewWithTag:1000]; //get the button 
    //... u can access all the contents in cell 
 }
 */

在您的情况下,这是单元格中的第一个按钮,为具有不同功能的每个按钮添加委托方法,对单元格中的另一个按钮重复上述过程

希望你能得到这个:) 快乐编码

于 2013-10-29T12:25:49.487 回答
1

使用 iOS7,您可以像这样获得它:

- (IBAction)actionForTheUniqueButton:(id)sender
{
    YouCellClass *clickedCell = (YouCellClass*)[[sender superview] superview];
    NSIndexPath *indexPathCell = [self.tableView indexPathForCell:clickedCell];
}
于 2013-10-29T11:03:04.293 回答
0

您的要求只是取回按钮的相应行值......

然后你有一个非常简单的方法,

@interface CellTypeOne : UITableViewCell
{
    NSNumber *rowval;
}
@property (nonatomic,retain)NSNumber* rowval;

CellTypeTwo.h 中的相同内容

@interface CellTypeTwo : UITableViewCell
{
    NSNumber *rowval;
}
@property (nonatomic,retain)NSNumber* rowval;

现在在两个 .m 文件中,您必须已经为按钮定义了一个方法,因此在这些方法中只需粘贴此行

NSLog(@"Number : %d",[rowval integerValue]);

并在 )tableView cellForRowAtIndexPath: 方法中也添加这一行

cell.rowval = [[NSNumber alloc]initWithInt:indexPath.row ];

现在每次按下不同单元格的按钮时,它都会回复单元格的行值

希望这会有所帮助.. :-)

于 2013-10-30T06:05:32.920 回答
0

您可以在每个单元格的 xib 中使用标签来区分它们。

[self tag]在单元格类中使用 after

于 2013-10-29T11:02:46.060 回答
0

在 .h 或 .m 文件中创建 tableView IBOutlet。您可以通过在您的 actionForFirstButton: 方法中使用来获取所选表格单元的索引路径

NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

 NSLog(@"I click on the first button in the first cell : %d", indexPath.row);

编辑:在你的 actionForFirstButton 方法中使用按钮的标签来获取索引路径

if(sender.tag == 0 || 1 || 2 || 3){
     {
       NSLog(@"the cell is : %d", 0);
     }
    else if(sender.tag == 4){
    {
      NSLog(@"the cell is : %d", 1);
    }
    else{
    NSLog(@"the cell is : %d", 2);
    }
于 2013-10-29T11:03:28.683 回答