2015-10-08 33 views
0

我無法對付這個問題。我正在研究一個具有時間軸的應用程序,在單元格中有一個圖像,一些按鈕和標籤。如圖所示,每個單元中有三個按鈕是愛,第二個是評論,第三個是共享。 enter image description here
現在當用戶選擇愛情按鈕時,我已經編碼,它將它的圖像更改爲filled-heart-icon,就像在instagram上一樣。更改圖像意味着呼叫已發送到網絡服務器,現在如果頁面刷新,將使圖像保持原樣。這樣做只是爲了讓用戶感覺他的更改已完成,所以應用程序會將此更改數據發送回來,因此用戶不會感覺到任何延遲。
但是,如果用戶喜歡圖片並向下滾動,以至圖像不在屏幕上,然後決定向上滾動,並且該圖像將再次以heart-icon而非filled-heart-icon來顯示,但是如果他刷新時間線,則將更改爲filled-heart-icon

因此,當一個單元格返回到屏幕的活動部分時,它會更改爲上次下載內容的狀態。我已經檢查過我的代碼,並且沒有再次刷新它或其他任何內容的調用。我的問題是我在哪裏可以找到這個問題。我檢查了我的cellForRowAtIndexPath方法三次,但沒有發現任何東西。如果有需要,我會在這裏添加代碼,但我認爲它更多的是需要解決的表格屬性。
我瞬間改變心臟圖標HomeCell.m類爲:UITableView重新在滾動上的單元格

if ([self.loveBtn.currentImage isEqual:[UIImage imageNamed:@"heart-icon-filled"]]) 
    { 
     [self.loveBtn setImage:[UIImage imageNamed:@"heart-icon"] forState:UIControlStateNormal]; 
    } 
    else 
    { 
     [self.loveBtn setImage:[UIImage imageNamed:@"heart-icon-filled"] forState:UIControlStateNormal]; 
    } 

如果時間軸刷新其改爲基於服務器的響應,即1表示喜歡0圖標表示未喜愛。下面的這張圖片幾乎是我寫的所有內容,可以讓您清楚地瞭解問題所在。 enter image description here

這裏是如何調用愛情按鈕。在我HomeViewController它首先有時間表我在ViewWillApear作爲註冊NSNotifications

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(HomeLovePostSuccess) name:@"HomeLovePostSuccess" object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(HomeLovePostFail:) name:@"HomeLovePostFail" object:nil]; 

HomeLovePostSuccess方法這就是我實際上並不做任何事情: - (無效)HomeLovePostSuccess { 的NSString * uid = [[NSUserDefaults standardUserDefaults] objectForKey:USERID]; NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys:uid,@「uid」,nil]; } 但在我cellForRowAtIndexPath我打電話web服務器:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
HomeCell *cellObj = (HomeCell*)[tableView dequeueReusableCellWithIdentifier:@"HomeCell" ]; 
if ([[isLikeArr objectAtIndex:indexPath.row] isEqualToString:@"1"]) { 
        [cellObj.loveBtn setImage:[UIImage imageNamed:@"heart-icon-filled"] forState:UIControlStateNormal]; 

       } 
       else 
       { 
        [cellObj.loveBtn setImage:[UIImage imageNamed:@"heart-icon"] forState:UIControlStateNormal]; 
       } 
return cellObj; 
} 

我覺得這事做dequeueReusableCellWithIdentifier

+0

看來你需要臨時存儲哪些項目有一個待定的電話「愛」。如果你分享你的代碼,它會更容易幫助你。另外,我非常懷疑它與表格視圖屬性有什麼關係。 –

+0

你需要顯示'cellForRowAtIndex'代碼 - 這是你將在單元格顯示時設置圖像的位置 – Paulw11

+0

@ Paulw11我在HomeCell.m中更改圖像:if([self.loveBtn.currentImage isEqual: [UIImage imageNamed:@「heart-icon-filled」]]) {self.loveBtn setImage:[UIImage imageNamed:@「heart-icon」] forState:UIControlStateNormal]; } else {self.loveBtn setImage:[UIImage imageNamed:@「heart-icon-filled」] forState:UIControlStateNormal]; } '這是爲了立即改變,刷新圖像變化後,從服務器的響應。 –

回答

0

這與您如何加載和保存按鈕的狀態有關。在大多數情況下,您將使用Model對象中的信息來保存單元格的不同屬性。當你調用tableView cellForRowAtIndexPath時,你會使用這個對象,在你的情況下,你會有一個Bool表示什麼是喜歡或不喜歡。當你將你的狀態發送到服務器,並且將「喜歡」狀態變爲true時,你需要更新模型中的Bool狀態。這樣,當你的手機離開屏幕,然後再次加載cellForRowAtIndexPath時,它將知道足夠的狀態以將其狀態改變爲「喜歡」。

由於您沒有包括任何代碼,它很難告訴你做什麼,這樣我假設你的解決方案是什麼保存喜歡的狀態顯示的代碼會更有幫助

+0

看到我編輯的問題。 –

+0

What @ paulw11說過,向我們展示cellForRowAtIndexPath正在做什麼,因爲一旦該單元格返回到屏幕上,它將再次被調用。這是什麼可能重置您以前所做的任何 – bolnad

+0

現在看到編輯版本。我已經添加了'cellForRowAtIndexPath'的代碼。我認爲這與'dequeueReusableCellWithIdentifier'有關 –

0

您需要專注於您的MVC設計。在這種情況下,您的HomeCell查看HomeViewController控制器並且通過每個單元模型以表示在tableView:cellForRowAtIndexPath:中。

你這樣做大部分,但你的模型是不完整的。有一個喜歡沒有被考慮的項目的臨時階段。

考慮這樣的事情:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    HomeCell *cellObj = (HomeCell*)[tableView dequeueReusableCellWithIdentifier:@"HomeCell" ]; 
    if ([[isLikeArr objectAtIndex:indexPath.row] isEqualToString:@"1"] || 
     [self.objectsBeingLiked contains:@(indexPath.row)]) 
    { 
     [cellObj.loveBtn setImage:[UIImage imageNamed:@"heart-icon-filled"] forState:UIControlStateNormal]; 
    } 
    else 
    { 
     [cellObj.loveBtn setImage:[UIImage imageNamed:@"heart-icon"] forState:UIControlStateNormal]; 
    } 
    return cellObj; 
} 

objectsBeingLiked將是包含了用戶請求喜歡,但服務器響應仍懸而未決的任何物品指數的NSMutableSet。如果有更適合放置的設置,請使用它。我把這個留給你的判斷。

此外,您的HomeLovePostSuccessHomeLovePostFail:方法可用於重新加載相應的單元格以指示加載已完成。如果您使用我的上述建議,則需要在調用這些方法時從objectsBeingLiked中刪除必要的索引。

相關問題