2013-05-22 57 views
0

您好我有一個UITableView,我dymanically插入細胞轉化爲它包含一個UIStepper和一個UILabel。 UILabel顯示UIStepper的值。集的標籤在由步進控制的細胞 - 目標C

- (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; 
} 

我已刪除了部分上面的線是爲了清晰,做的格式,但是這個作品,一切都OK。

-(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委託方法的標籤文本?

回答

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

+0

好吧,我已經嘗試過,它沒有工作。我試過放行NSLog(@「%@」,[cell.contentView subviews]); NSLog(@「%d」,[[cell.contentView subviews] count]);在該方法的結尾,數組只包含cell.textlabel並且count是1.我不確定爲什麼會這樣,因爲它看起來應該是這樣。 – Jamesla

+0

嘗試使用[cell.contentView addSubview:stepper];和[cell.contentView addSubview:label]; – Bonnie

+1

很酷的工作,但是我不得不將subview instatiation行更改爲UIView * subview = [[cell subviews] lastObject] ;.感謝您的幫助,我真的很感激。 – Jamesla

0

您可以將標籤設置爲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 

} 
+0

如果有多個部分,該怎麼辦? – Bonnie

+0

然後你可以像這樣設置標籤: [label setTag :((indexPath.section&0xFFFF)<< 16)| (indexPath.row&0xFFFF)]; –

+0

而在委託方法中,您可以像這樣獲取行和部分: NSUInteger section =((sender.tag >> 16)&0xFFFF); NSUInteger row =(發件人。標記&0xFFFF); –

0

您應該更新與步進值的模型,然後將標籤的價值基礎上設置該模型中的價值。你應該給步進器的cellForRowAtIndexPath中的一個標籤,它等於indexPath.row,並且在步進器的操作方法中,將模型中某個屬性的值設置爲步進器的值。然後,重新加載該行在同一個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"]]; 

在這個例子中,我假設你已經字典數組(海圖)具有所有數據你需要填充單元格。其中一個字典鍵「stepperValue」將用於將步進值存儲爲NSNumber。