如何检测行上点击按钮的indexPath?

时间:2014-04-13 08:17:42

标签: objective-c uibutton uitableview

我有UItableView

enter image description here

我想增加/减少行的具体UIProgressView,当我点击减号/加号而不是重新加载整个UITableView时,因为所有行都是相互依赖的。我不知道如何检测哪一行按下减号/加UIButton。我尝试使用rowDidSelect,但它没有用。你能告诉我吗?

EDITED

我有一个UITableCell(ActivityCell - 类)类和UITableViewController类(lessonActivityTVC - 类)。在Cell类我有IBOutlets

ActivityCell.h
@interface ActivityCell : UITableViewCell
@property (strong, nonatomic) IBOutlet UILabel *studentNameLabel;
@property (strong, nonatomic) IBOutlet UIProgressView *progressView;

在ActivityCell.m中我什么都没有。我在这里有按钮的IBActions,但是我将动作移到了lessonActivity.m,因为当我按下任何按钮时我需要重新加载UITableView而我不知道它是如何在ActivityCell.m中进行的。我的课程代码动画TV.m就在这里:

@implementation tchLessonActivityTVC
#define debug 1

- (IBAction)incrementActivity:(id)sender {

    NSLog(@"increment");
}
- (IBAction)decrementActivity:(id)sender {
    NSLog(@"decrement");
}

-(void)fetchData{
    CoreDataHelper *cdh = [(AppDelegate*)[[UIApplication sharedApplication]delegate]cdh];
    SchoolClass *schoolClass = (SchoolClass*)[cdh.context existingObjectWithID:[IDsManager getClassID] error:nil];
    Lesson *lesson = (Lesson*)[cdh.context existingObjectWithID:[IDsManager getLessonID] error:nil];

    if (lesson.activities.count == 0) {
        for (Student *student in schoolClass.students) {
            Activity *activity = [NSEntityDescription insertNewObjectForEntityForName:@"Activity" inManagedObjectContext:cdh.context];
            activity.student = student;
            activity.lesson = lesson;
            [lesson addActivitiesObject:activity];
            [student addActivitiesObject:activity];
        }
    }
    self.activities = [NSArray arrayWithArray:[lesson.activities allObjects]];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.tableView.delegate = self;
    [self fetchData];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.activities.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(debug == 1){
        NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
    }

    static NSString *cellIndetifier = @"Activity Cell";
    ActivityCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIndetifier
                                                         forIndexPath:indexPath];

    Activity *activity = [self.activities objectAtIndex:indexPath.row];

    cell.studentNameLabel.text = activity.student.name;
    CGAffineTransform transform = CGAffineTransformMakeScale(1.0f, 5.0f);
    cell.progressView.transform = transform;

    cell.progressView.progress = 0.32f;        
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"selected index is %d",indexPath.row);
}
@end

2 个答案:

答案 0 :(得分:2)

UITableView有一个委托方法didSelectRowAtIndexPath:,你可以从那里获得indexPath.row。不要忘记在UITableViewDelegate行的末尾添加<UITableViewDelegate>并设置

,将您的课程设为@interface
tableView.delegate = self;

在代码中,或在Interface Builder中执行。如果你在UITableViewController,那么你可以免费获得。

修改

这是委托模式示例:

tableviewcell h

@protocol TableViewCellDelegate <NSObject>

- (void)requestToReloadTableViewFromCell:(UITableViewCell *)cell;

@end

@interface TableViewCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *dateLabel;
@property (weak, nonatomic) id <TableViewCellDelegate> cellDelegate;

@end

tableviewcell m

- (IBAction)buttonAction:(UIButton *)sender
{
    [self.cellDelegate requestToReloadTableViewFromCell:self];
}

tableviewcontroller m

@interface TableViewController () <TableViewCellDelegate>

@end

@implementation TableViewController

- (void)requestToReloadTableViewFromCell:(UITableViewCell *)cell
{
    NSLog(@"%d", [[self.tableView indexPathForCell:cell] row]);
    [self.tableView reloadData];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    // Configure the cell...
    cell.cellDelegate = self;
    cell.dateLabel.text = [[NSDate date] description];

    return cell;
}

答案 1 :(得分:0)

您可以在cellForRowAtIndexPath方法中以编程方式使用带有这些按钮的标记。每个按钮的标签应该不同(你可以使用一些公式,例如标签将等于行号)。这样当按下按钮时,你将首先检查标签,并且可以知道在哪一行按下了哪个按钮。