如何刷新一个uitableview?
Posted
技术标签:
【中文标题】如何刷新一个uitableview?【英文标题】:How to refresh a uitableview? 【发布时间】:2015-05-13 14:18:21 【问题描述】:点击按钮后,我正在尝试刷新我的UITableView
。当我点击按钮时,它会添加一个新单元格,但不会在单元格中添加标签等内容。我相信这可能与我的一段代码有关,它不会让标签在滚动时变得混乱。这是我的视图控制器数据代码。
附:我在按钮代码中使用了[tableview reloadData]
。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
[self ref];
[self getNumOfRows];
return numRows-2;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
return 80;
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];
if(cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell"];
else
UIView* subview;
while ((subview = [[[cell contentView] subviews] lastObject]) != nil)
[subview removeFromSuperview];
int idNum = 1;
/*NSString *getStrResult;
NSString *getURL = [NSString stringWithFormat:@"http://localhost/MyphpStuff/stuff/sendData.php?id=%@&db=%@", [NSString stringWithFormat:@"%d",idNum],@"ConversationTest"];
NSData *getDataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:getURL]];
getStrResult = [[NSString alloc] initWithData:getDataURL encoding:NSUTF8StringEncoding];*/
[self ref];
idNum++;
UILabel *textLabel;
UILabel *userLabel;
if(![username isEqualToString:[users objectAtIndex:indexPath.row]])
cell.backgroundColor = [UIColor colorWithRed:(159/255.0) green:(4/255.0) blue:(223/255.0) alpha:1];
if([username isEqualToString:[users objectAtIndex:indexPath.row]])
cell.backgroundColor = [UIColor colorWithRed:(176/255.0) green:(247/255.0) blue:(146/255.0) alpha:1];
//cell.textLabel.font = [ UIFont fontWithName: @"Arial" size: 18.0];
//cell.textLabel.text = [users objectAtIndex:indexPath.row];
textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 300, 25)];
textLabel.text = [text objectAtIndex:indexPath.row];
[cell.contentView addSubview:textLabel];
userLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 25)];
userLabel.text = [users objectAtIndex:indexPath.row];
[cell.contentView addSubview:userLabel];
idNum++;
return cell;
这是我的按钮代码:
- (IBAction)post:(id)sender
NSString *post = postText.text;
NSString *post2 = [post stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
NSString *URL = [NSString stringWithFormat:@"http://localhost/MyPhpStuff/stuff/post.php?username=%@&text=%@&db=%@", username, post2, @"ConversationTest"];
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL]];
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
[self ref];
[tableview reloadData];
【问题讨论】:
你的意思是[tableview reloadData]
不起作用?
它有点工作,因为它正在重新加载并获得需要制作一个新单元格,因此它创建了一个新单元格,但它没有使用它应该使用的两个标签填充单元格。
代替[cell.contentView addSubview:userLabel];
使用[cell addSubview:userLabel];
@Azat... 你永远不会直接向单元格添加子视图。始终将子视图添加到内容视图
@Azat,理解并同意大声笑。老实说,我认为他应该开始去 raywenderlich.com 学习如何使用 ios SDK。这个功能实际上是基础的基础,如果有困难,通常表明对 SDK 的工作原理缺乏了解(在这种情况下是 tableViews 的工作原理)
【参考方案1】:
有几种众所周知的刷新UITableView
的方法。
-reloadData
- 此方法通过保持屏幕上的当前行位置完全刷新整个表格视图。但是,这不是很漂亮,还有其他两种方法
-reloadSections:withRowAnimation:
- 您可以使用 UITableViewRowAnimation
枚举类型之一调用该方法以动画重新加载表视图。您还可以在此处指定要重新加载的部分
-reloadRowsAtIndexPaths:withRowAnimation:
- 它类似于以前的方法,除了在这里你传递indexPath
s 你希望重新加载的单元格数组
【讨论】:
【参考方案2】:您应该仅在创建单元格时构建/构建单元格内容,而不是在将其出列时(如果出列单元格的结构相同,但这就是它的目的)。
像这样重构您的 cellForRowAtIndexPath
方法:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];
if(cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell"];
textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 300, 25)];
textLabel.tag = 100001; // a big integer to identify it
[cell.contentView addSubview:textLabel];
userLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 25)];
userLabel.tag = 100002; // another big integer
[cell.contentView addSubview:userLabel];
else
// retrieve subviews
textLabel = [cell.contentView viewWithTag:100001];
userLabel = [cell.contentView viewWithTag:100002];
// what is the need for this local variable?
int idNum = 1;
/*NSString *getStrResult;
NSString *getURL = [NSString stringWithFormat:@"http://localhost/MyPhpStuff/stuff/sendData.php?id=%@&db=%@", [NSString stringWithFormat:@"%d",idNum],@"ConversationTest"];
NSData *getDataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:getURL]];
getStrResult = [[NSString alloc] initWithData:getDataURL encoding:NSUTF8StringEncoding];*/
// what is this call doing?
[self ref];
idNum++;
if(![username isEqualToString:[users objectAtIndex:indexPath.row]])
cell.backgroundColor = [UIColor colorWithRed:(159/255.0) green:(4/255.0) blue:(223/255.0) alpha:1];
if([username isEqualToString:[users objectAtIndex:indexPath.row]])
cell.backgroundColor = [UIColor colorWithRed:(176/255.0) green:(247/255.0) blue:(146/255.0) alpha:1];
textLabel.text = [text objectAtIndex:indexPath.row];
[cell.contentView addSubview:textLabel];
userLabel.text = [users objectAtIndex:indexPath.row];
[cell.contentView addSubview:userLabel];
// again, what is the need for this?
idNum++;
return cell;
您可以分配给 UIView 的 tag
稍后可以通过调用 viewWithTag:
来检索。请注意,系统已经使用了较小的值(例如在 UITableViewCell 内部层次结构中)。
【讨论】:
【参考方案3】:首先创建一个自定义UITableViewCell (tutorial)。
您可以将子视图添加到您的自定义单元格并在 cellForRowAtIndexPath
中设置它们的值。
那么你就不需要这样做了:“[subview removeFromSuperview];
”
使用您的代码和一些测试数据创建实现后,我能够点击一个按钮,将一个对象添加到可变数组text
和users
,调用[self.tableView reloadData]
,然后查看表中显示的数据。我的cellForRowAtIndexPath
方法和你的一样。
请务必检查您是否通过objectAtIndex:
获得了预期的数据。
【讨论】:
以上是关于如何刷新一个uitableview?的主要内容,如果未能解决你的问题,请参考以下文章