[英]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.