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有关