我有UItableView
:
我想增加/减少行的具体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
答案 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
方法中以编程方式使用带有这些按钮的标记。每个按钮的标签应该不同(你可以使用一些公式,例如标签将等于行号)。这样当按下按钮时,你将首先检查标签,并且可以知道在哪一行按下了哪个按钮。