如何刷新一个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: - 它类似于以前的方法,除了在这里你传递indexPaths 你希望重新加载的单元格数组

【讨论】:

【参考方案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];


使用您的代码和一些测试数据创建实现后,我能够点击一个按钮,将一个对象添加到可变数组textusers,调用[self.tableView reloadData],然后查看表中显示的数据。我的cellForRowAtIndexPath 方法和你的一样。

请务必检查您是否通过objectAtIndex: 获得了预期的数据。

【讨论】:

以上是关于如何刷新一个uitableview?的主要内容,如果未能解决你的问题,请参考以下文章

如何将单击行导航到另一个 UITableView?

不调用UITableView Delegate

可滚动且与 UITable 滚动同步的背景图像

不要删除 UITable 的第一行

UIPageControl 与 UITableView

如何刷新一个uitableview?