2013-01-24 22 views
4

我正在使用故事板中配置的一些靜態UITableViewCell來顯示一些設置信息。靜態UITableViewCell在viewWillAppear中更改不會反映在顯示中

如果其他設置之一被關閉,則應禁用其他一些單元。

爲了使細胞進入適當的狀態,在viewWillAppear我從NSUserDefaults讀取設置,然後相應地更改單元格。

- (void) viewWillAppear:(BOOL)animated 
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) { 
      [self otherCell].alpha = 1.0; 
      [self otherCell].userInteractionEnabled = YES; 
     } 
     else { 
      NSLog(@"Changing alpha to 0.3"); 
      [self otherCell].alpha = 0.3; 
      [self otherCell].userInteractionEnabled = NO; 
     } 

的問題是,當我真正運行的程序,即使它的日誌阿爾法變化時說,阿爾法實際上並沒有改變。 userInteractionEnabled似乎堅持,但alpha保持在1.0。

這不是一個單元複用的問題,或者單元沒有及時實例化,因爲其他設置可以很好地改變。

將其從cell.alpha更改爲cell.contentView.alpha的作品,但這是一個不同的設置。

看起來好像所有的設置「棒」,除了alpha設置,它以某種方式被覆蓋。

+0

你有沒有試過[cell setNeedsDisplay]; ? –

+0

正如我所說,如果我真的打印'cell.alpha'一旦表完成加載,它被設置爲不正確的值1.0。所以價值甚至沒有被保存。如果我喜歡改變顏色,他們會得到保存,所以我不認爲這是一個繪圖問題。 – divergio

回答

4

我在回答我自己的問題,因爲我能解決它。

首先,我試着把cellForRowAtIndexPath中的阿爾法變化,但那也沒用。經過很多修補後,我得出結論,UITableViewCell的alpha設置在某種程度上是特殊的,因爲它不斷被覆蓋或設置爲1.0。

我發現了兩個解決方法:

首先,而不是做在cellForRowAtIndexPath的變化,這樣做在UITableViewDelegate方法willDisplayCell。無論出於何種原因,在這種方法中改變單元格的alpha值實際上會一直存在。當然,如果你是這樣,你必須重新安排你的邏輯,這樣的變化是在一個細胞通過細胞的基礎上進行,即:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell 
             forRowAtIndexPath:(NSIndexPath *)indexPath { 
if (cell == [self otherCell]) { 
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) { 
     cell.alpha = 1.0; 
     cell.userInteractionEnabled = YES; 
    } 
    else { 
     NSLog(@"Changing alpha to 0.3"); 
     cell.alpha = 0.3; 
     cell.userInteractionEnabled = NO; 
    } 
} 
} 

正如我所說的,我不知道究竟爲什麼這個工作在willDisplayCell而不是在cellForRowAtIndexPath。其他人似乎也不確定:

What is -[UITableViewDelegate willDisplayCell:forRowAtIndexPath:] for?

UITableView background with alpha color causing problem with UITableViewCell

另一個解決辦法是,不使用有問題的α,使用其他設置,這將達到同樣的效果。在我的情況下,這是contentView.alphabackgroundColor。無論出於何種原因,這些設置會堅持,你甚至可以將它們設置在viewWillAppear,它會按預期工作:

- (void) viewWillAppear:(BOOL)animated { 
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OtherCellEnabled"]) { 
      [self otherCell].backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0]; 
      [self otherCell].contentView.alpha = 1.0; 
      [self otherCell].userInteractionEnabled = YES; 
     } 
     else { 
      NSLog(@"Changing alpha to 0.3"); 
      [self otherCell].backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.3]; 
      [self otherCell].contentView.alpha = 0.3; 
      [self otherCell].userInteractionEnabled = NO; 
     } 
} 

的第二種方法的缺點是,現在要覆蓋故事板的單元格顏色設置,但如果你關心這個問題,你可以通過向故事板詢問顏色來解決這個問題。

我不知道爲什麼cell.alpha的處理方式不同。也許有關靜態單元格實現的方式。

+0

+1用於找到自己的答案併發布! – Jacco

0

你可以試着暗示的細胞應該是你if { .. } else { .. }後重新繪製,使用setNeedsDisplay:基於您的評論

[self otherCell setNeedsDisplay] 

,你怎麼來otherCellIs this a post that might help

+0

這不是單元格繪製的問題。如果我實際上在完成繪製時輸出alpha值,則alpha值保留爲1.0。 – divergio

+0

這些是靜態單元格,所以otherCell只是一個連接到Storyboard中的IBOutlet。那篇文章也不是問題,因爲關於單元格的所有其他內容都會改變(比如'userInteractionEnabled')。我從'cellForRowAtIndexPath'得到的單元格是正確的單元格,只是alpha在得到出列和顯示之間得到了重置。 – divergio

相關問題