您好我有一个UITableView,我正在插入包含UIStepper和UILabel的单元格。 UILabel显示UIStepper的值。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if(!cell)
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
[cell.textLabel setText:[self.myarray objectAtIndex:indexPath.row]];
UIStepper *stepper = [[UIStepper alloc]init];
UILabel *label = [[UILabel alloc]init];
label.text = [NSString stringWithFormat:@"%.f", stepper.value];
[cell addSubview:stepper];
[cell addSubview:label];
[stepper addTarget:self action:@selector(incrementStepper:) forControlEvents:UIControlEventValueChanged];
return cell;
}
为了清楚起见,我已经删除了一些上面的格式化行,但是这样可行并且一切正常。
-(void)incrementSkillStepper:(id)sender
{
UIStepper *stepper = (UIStepper*)sender;
//set the label that is in the same cell as the stepper with index stepper.value.
}
当我单击特定单元格中的步进器时,我希望同一单元格中的标签增加,但我的问题在于addtarget的工作方式 - 我只能发送发件人,在这种情况下是步进器到事件,这意味着它无法访问动态创建的标签。有没有人知道我如何设置incrementStepper委托方法的标签文本?
答案 0 :(得分:3)
致电[sender superview]
以获取其所在的单元格
-(void)incrementSkillStepper:(id)sender
{
UIStepper *stepper = (UIStepper*)sender;
UITableViewCell* cell = [stepper superview];
UIView* subview = [[cell subviews] lastObject]; // Make sure your label *is* the last object you added.
if ([subview isKindOfClass:[UILabel class]]) {
// do what you want
}
}
您也可以通过[cell.contentView subviews]
array
循环,获取所需的标签,最好为标签添加tag
值,然后使用viewWithTag
答案 1 :(得分:0)
您可以将标记设置为UIStepper作为indexPath.row,并将标记设置为标记为indexPath.row + 999。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UIStepper *stepper = [[UIStepper alloc]init];
stepper.tag = indexPath.row;
UILabel *label = [[UILabel alloc]init];
label.tag = indexPAth.row + 999;
//......
}
现在在UIStepper的委托方法中,你可以在这个单元格中找到像这样的标签
-(void)incrementSkillStepper:(id)sender
{
UIStepper *stepper = (UIStepper*)sender;
UILabel *label = (UILabel *)[self.view viewWithTag:sender.tag + 999];
//now this is same label as you want. Now you can change the value of label as you want
}
答案 2 :(得分:0)
您应该使用步进器的值更新模型,然后根据模型中的值设置标签的值。您应该为步进器提供一个等于indexPath.row的cellForRowAtIndexPath标记,并在步进器的action方法中,将模型中属性的值设置为步进器的值。然后,在同一个indexPath处重新加载行。
(void)incrementSkillStepper:(UIStepper *)sender {
NSInteger row = sender.tag;
[self.theData[row] setObject:@(sender.value) forKey:@"stepperValue"];
[self.tableView reloadRowsAtIndexPaths: @[row] withRowAnimation:UITableViewRowAnimationNone];
}
在cellForRowAtIndexPath中,你可以这样填充标签:
UILabel *label = [[UILabel alloc]init];
label.text = [NSString stringWithFormat:@"%@", self.theData[indexPath.row][@"stepperValue"]];
在这个例子中,我假设你有一个字典数组(theData),它包含填充单元格所需的所有数据。其中一个字典键,“stepperValue”将用于将步进器值存储为NSNumber。