2010-04-27 43 views
1

我們無法找到一種將UITableCell內部的UIViews動畫爲回調動作的方法。回調之後,在UITableViewCell裏面設置動畫UIViews的好方法是什麼?

假設在您點擊UITableViewCell上的按鈕並且觸發異步操作下載圖片的場景中。進一步假設當圖片下載時,我們需要在單元格中創建一個UIView動畫,給用戶一個視覺反饋,即將要呈現的新東西。

我們無法找到一種方法來追蹤UIVIew以調用beginAnimation,因爲用戶點擊的原始單元格現在可能會用於另一行,原因是上下滾動時單元格的性質會被重用在桌子裏。換句話說,我們不能保留一個指向那個UITableViewCell的指針。我們需要找到另一種方法來定位單元格,並在該行可見時對其進行動畫處理,並且如果該行滾動超出範圍則不會生成動畫。

+1

你能跟蹤段索引和行索引嗎? – willcodejavaforfood 2010-04-27 15:29:35

+0

我們有部分和行,但我們找不到UIViews(我們想要動畫的)。我們不知道它是哪個單元格。 – erotsppa 2010-04-27 15:33:01

+0

如果你知道行和段,那麼你通過[tableView cellForRowAtIndexPath:indexPath]知道單元格。 – Skie 2010-04-27 15:35:52

回答

1

保持單元格對象不同於被動畫的對象,以便單元格保存UIView。當動畫回調發生時,請檢查以確保UIView仍然存在,並且如果存在,請爲這些更改設置動畫。

當單元格對象從屏幕上被碰撞並回收時,釋放將被動畫並創建一個新UIView的UIView。當動畫回調發生時,它將無所事事,因爲UIView不再存在。

上述修改是保留UIView中的某種對象,以便回調可以檢查動畫是否合適。這可能是正在下載的圖片的某種唯一標識符。如果標識符改變,則不需要動畫。如果匹配,請動畫。


編輯:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *MyIdentifier = @"MyTableCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
             reuseIdentifier:MyIdentifier] autorelease]; 
    } else { 
     UIView *oldViewToAnimate = [cell.contentView viewWithTag:1]; 
     [oldViewToAnimate removeFromSuperview]; 
    } 

    UIView *viewToAnimate = [[UIView alloc] initWithFrame:CGRectZero]; //replace with appropriate frame 
    viewToAnimate.tag = 1; 
    [cell.contentView addSubview:viewToAnimate]; 

    return cell; 
} 

當你產卵你[cell.contentView viewWithTag:1]通過您的下載過程。下載完成後,它將更新適當的視圖。如果表格單元被重用,視圖將不再具有超級視圖,並且不會更新錯誤的單元格。

有些事情可以做,以提高效率,但這是基本的想法。如果你有一個自定義的UITableViewCell比這可能看起來有點不同。


編輯2:

要重用viewToAnimate對象,以確保如果他們的父母細胞再生,他們得到更新,這樣做如下:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *MyIdentifier = @"MyTableCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
             reuseIdentifier:MyIdentifier] autorelease]; 
    } else { 
     UIView *oldViewToAnimate = [cell.contentView viewWithTag:1]; 
     [oldViewToAnimate removeFromSuperview]; 
    } 

    UIView *viewToAnimate = [self viewToAnimateForIndexPath:indexPath]; 
    viewToAnimate.tag = 1; 
    [cell.contentView addSubview:viewToAnimate]; 

    return cell; 
} 

viewToAnimateForIndexPath需要:

  • 檢查是否已爲此indexPath創建viewToAnimate
  • 創建viewToAnimate如果沒有一個
  • 保存到可以由indexPath中查找該視圖的引用
  • 返回的viewToAnimate所以表格單元格可以用它

我不對於你的數據結構足夠了解。一旦下載過程完成,它可以調用相同的方法來獲取視圖並對其進行動畫處理。

+0

問題是當你完成回調時,你存儲的UIView指針可能不再有效。該UIView可能被用來表示另一個單元格。此外,需要動畫的實際單元格現在可能會有另一個代表它的新UIVIew。 – erotsppa 2010-04-27 15:45:27

+0

UIView不應該代表單元格。它應該表示可能需要動畫的單元格的內容。所以cellView有一個contentView的子視圖。當cellView被重用時,它應該創建一個新的contentView並釋放舊的contentView。 – MrHen 2010-04-27 16:40:21

+0

你是什麼意思?你仔細閱讀了我的消息嗎?當你滾動tableView時,UIViews指針不再有效,因爲它們會被混洗。 – erotsppa 2010-04-27 16:51:53