Ios UITableView重新设置滚动单元格

Ios UITableView重新设置滚动单元格,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我无法解决这个问题。我正在开发一个有时间线的应用程序,在一个单元格中有一个图像、一些按钮和标签。每个单元格中有三个按钮,一个是“爱”,第二个是“评论”,第三个是“共享”,如图所示。现在,当用户选择“爱”按钮时,我已经编码,它会将其图像更改为一个“填充的心”图标,就像instagram上的图标一样。更改图像意味着调用已发送到web服务器,现在如果页面刷新,它将保持图像不变。这样做只是为了让用户感觉到他的更改已经完成,因此,应用程序将此更改数据发送到后面,用户不会因此而感到任何延迟。但如果用户喜欢图

我无法解决这个问题。我正在开发一个有时间线的应用程序,在一个单元格中有一个图像、一些按钮和标签。每个单元格中有三个按钮,一个是“爱”,第二个是“评论”,第三个是“共享”,如图所示。
现在,当用户选择“爱”按钮时,我已经编码,它会将其图像更改为一个“填充的心”图标,就像instagram上的图标一样。更改图像意味着调用已发送到web服务器,现在如果页面刷新,它将保持图像不变。这样做只是为了让用户感觉到他的更改已经完成,因此,应用程序将此更改数据发送到后面,用户不会因此而感到任何延迟。
但如果用户喜欢图片并向下滚动,使图像脱离屏幕,然后决定向上滚动,则该图像将再次显示一个
心形图标
而不是
心形图标
,但如果他刷新时间线它将被更改为“填充的心脏”图标,因此当一个单元格返回到屏幕的活动部分时,它将更改为上次下载内容的状态。我已经检查了我的代码,没有调用再次刷新代码或其他任何东西。我的问题是我在哪里可以找到这个问题。我已经检查了三次我的
cellforrowatinexpath
方法,但没有找到任何结果。如果需要,我会在这里添加代码,但我认为需要解决的更多是表的属性。
我正在
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];
    }
如果时间线刷新,则根据服务器响应更改图标,即1表示喜欢,0表示不喜欢。下面的这张图片几乎就是我写的所有东西,让你清楚地了解这个问题。

以下是如何为love按钮生成调用。在我的
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
方法中,这是我实际上没有做的事情: -(空)成功后的家 { NSString*uid=[[NSUserDefaults standardUserDefaults]objectForKey:USERID]; NSDictionary*dict=[[NSDictionary alloc]initWithObjectsAndKeys:uid,@“uid”,nil]; } 但是在我的
cellforrowatinexpath
中,我正在调用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

有关这与如何加载和保存按钮状态有关。在大多数情况下,您将使用模型对象中的信息来保存有关单元的不同属性。当调用
tableView cellforrowatinexpath
时,您将使用此对象,在您的情况下,您将有一个表示喜欢或不喜欢的对象的Bool。当您将状态发送到服务器,并将“喜欢”状态变为true时,您还需要更新模型中Bool的状态。这样,当您的单元格离开屏幕,然后再次加载到
cellforrowatinexpath
中时,它将知道足够的信息,可以将其状态更改为“喜欢”


由于您没有包含任何代码,很难说您在做什么,因此显示代码会更有帮助,因为我假设您的解决方案是什么,以保存喜欢的状态

您需要关注您的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
,其中包含用户请求喜欢但服务器响应仍挂起的任何项目的索引。如果场景中有更适合放置的内容,请使用它。我让你来判断


此外,您的
HomeLovePostSuccess
HomeLovePostFail:
方法可用于重新加载相应的单元格,以指示加载已完成。如果您使用我的上述建议,那么在调用这些方法时,您需要从
objectsbeinglied
中删除必要的索引。

似乎您需要临时存储哪些项具有挂起的“love”调用。如果你分享你的代码,它将更容易帮助你。另外,我非常怀疑它与表视图属性有任何关系。您需要显示
cellforrowatinex
code-当单元格被选中时,您将在这里设置图像displaydd@Paulw11我正在更改HomeCell.m:
if([self.loveBtn.currentImage isEqual:[UIImage ImageName:@“heart icon filled”]){[self.loveBtn setImage:[UIImage ImageName:@“心脏图标”]用于状态:UIControlStateNormal];}其他{[self.loveBtn setImage:[UIImage ImageName:@“心脏图标填充”]用于状态:UIControlStateNormal];}
这是为了在刷新服务器响应上的图像更改后立即更改。@GuyKogus查看我编辑的答案。并告诉我您需要查看哪些特定代码?因为我不知道要共享哪个部分。您无法跟踪单元格本身的状态。您需要立即更新数据模型,以便
cellForRowAtIndexPath
可以提供正确的图像。@paulw11所说的,告诉我们CellForRowatineXpath在做什么,因为一旦该单元格回到屏幕上,它将再次被调用。这可能就是重置您以前所做的任何事情。现在看到编辑的版本。我已经添加了
CellForRowatineXpath
的代码。我认为这有一些问题g与
dequeueReusableCellWithIdentifier有关