簡體   English   中英

在UITableview中滾動時,UiButton狀態會不斷變化

[英]UiButton state keeps changing when scrolling in UITableview

我知道這上面有幾篇文章,但是我仍然感到困惑,為什么我在表視圖中創建的按鈕在被選中時不會保持其狀態。 當我滾動時,未選擇的按鈕會受到影響,並且它會來回改變。 請幫忙。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    static NSString *simpleTableIdentifier = @"SimpleTableCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [myButton setTitle:@"Like" forState:UIControlStateNormal];
        [myButton addTarget:self action:@selector(tapped:) forControlEvents:UIControlEventTouchUpInside];
        myButton.frame = CGRectMake(14.0, 10.0, 125.0, 25.0);
        myButton.tag =indexPath.row;
        [cell.contentView addSubview:myButton];



    }
    else{
        [cell.contentView addSubview:myButton];

    }
 if ([array objectAtIndex:indexPath.row==0]) {
        [myButton setTitle:@"Like" forState:UIControlStateNormal];

    }
    else{
        [myButton setTitle:@"Unlike" forState:UIControlStateNormal];


    }


    cell.textLabel.text = [recipes objectAtIndex:indexPath.row];

    return cell;
}


-(void)tapped:(UIButton *)sender {

    if ([sender.currentTitle isEqualToString:@"Like"]) {
        [sender setTitle:@"Unlike" forState:UIControlStateNormal];
[array replaceObjectAtIndex:sender.tag withObject:[NSNumber numberWithInt:1]];
    }
    else{
        [sender setTitle:@"Like" forState:UIControlStateNormal];

    }


}

幫助您了解為什么會發生這種情況; 每次在表格視圖的屏幕上顯示行的單元格時,都會調用tableView:cellForRowAtIndexPath:方法來檢索將要顯示的單元格。 也就是說,當第一次顯示一個單元格時,將調用此方法。 然后,如果該單元格退出屏幕,然后再次回到屏幕上,將再次調用此方法,以設置和檢索該單元格。

因此,在此情況下,您正在顯示Recipe A的單元格(上面有一個按鈕)。 按下按鈕,將更改其狀態。 Recipe A離開屏幕,然后又回到屏幕上時,您將返回另一個單元格(因為使用dequeueReusableCellWithIdentifier:重復使用了表格單元格)。 對於該單元格上的按鈕,正在進行兩件事:

  • 第一次使用時,該單元格上已經有一個按鈕(也許用於其他配方)。 對於Recipe A您沒有告訴它它應該處於“喜歡”還是“不喜歡”狀態。
  • 您向該單元格添加了另一個按鈕,但實際上並未設置其框架/標題,因此您實際上將不會看到它。

您需要做的是在模型中的某個位置跟蹤用戶“喜歡”您的哪些項(配方)。 您可以在tapped:方法的某個位置執行此操作。

然后,在tableView:cellForRowAtIndexPath:方法中,您需要將按鈕設置為該行/配方的適當狀態(“喜歡”與否)。

您需要確保每次調用該方法時都執行此操作,而不僅是在if (cell == nil)塊中。 順便說一句,您是否有理由使用dequeueReusableCellWithIdentifier:而不是dequeueReusableCellWithIdentifier:indexPath 后者可從iOS 6開始使用,並保證返回一個單元格,因此, if (cell == nil)業務, if (cell == nil)無需執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM