UITableView 无法从 CustomCell 重新加载数据

Posted

技术标签:

【中文标题】UITableView 无法从 CustomCell 重新加载数据【英文标题】:UITableView cannot reload the data from CustomCell 【发布时间】:2013-08-28 06:42:49 【问题描述】:

我有一个带有 CustomCells 的 UITableView。这是一个收藏夹列表,每个 CustomCell 中都有明星图像。因此,如果我再次单击点亮的星星,它们必须消失并从名为 fav.plist 的属性列表中删除。

但是当我点击点亮的星星时,它们并没有消失。我无法从 CustomCell.m 重新加载收藏列表中的数据。要消失我单击星号的数据,我必须再次查看该视图。这是重新加载数据的唯一方法。

如何让它在点击星星后重新加载数据并保持在同一视图?

这是我的CustomCell.m代码的一部分,其中最喜欢的列表是(列表的UITableView是favView,plist是fav.plist):

 @property (nonatomic, retain) NSMutableArray *favList; 

  //First I find the item from plist which one will be removed from fav.plist.
    NSString *path_fav = [[self documentsDirectory] stringByAppendingPathComponent:@"fav.plist"];
    self.favList = [[NSMutableArray alloc] initWithContentsOfFile:path_fav]; 
    for (NSInteger i=0; i<[self.favList count];i++) 
        d = [self.favList objectAtIndex:i];
        NSString *code=[d objectForKey:@"CODE"];
        NSComparisonResult res=[code compare:self.cityLabel.text];
        if(res==NSOrderedSame)
            //removing from the fav.plist
            [self.favList removeObjectAtIndex:i];
            //Here I try to reload the data for the UITableView called favView
            //In Favorite.m is my UITableView called favView
            NSString *path = [[self documentsDirectory]
                              stringByAppendingPathComponent:@"fav.plist"];                
            [self.favList writeToFile:path atomically:TRUE];
            Favorite *favController =[[Favorite alloc]init];
            [favController.favView reloadData];
            [favController.favView reloadInputViews];

        
    

这是我的 Favorite.m 代码的一部分:

-  (UITableViewCell*)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath


    static NSString *cellID = @"cellid";

    CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:cellID ];
    if (cell == nil)
    
        cell = (CustomCell*)[[[NSBundle mainBundle]
                              loadNibNamed:@"CustomCell" owner:nil options:nil]
                             lastObject];
    

    NSDictionary *d = [self.favList objectAtIndex:indexPath.row];
    cell.nameLabel.text = [d objectForKey:@"NAME"];
    cell.cityLabel.text = [d objectForKey:@"CODE"];
    cell.index= [NSString stringWithFormat:@"%d",indexPath.row];
    cell.indexPath = indexPath;

    NSString *starName;
    if([[d objectForKey:@"FAV"] intValue]==0)
        starName=@"star.png";
    else
        starName=@"starb.png";
    

    [cell.self.starbtn setImage:[UIImage imageNamed:starName] forState:UIControlStateNormal];

    if((indexPath.row % 2) ==0)
        cell.contentView.backgroundColor=[UIColor colorWithRed:241/256.0 green:237/256.0 blue:237/256.0 alpha:1.0];
    CGSize maxSize = CGSizeMake(320/2, MAXFLOAT);
    CGSize nameSize = [cell.nameLabel.text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:maxSize lineBreakMode:NSLineBreakByWordWrapping];
    if(nameSize.height>=72)
        nameSize.height=63;
    else
        nameSize.height=38;
    cell.nameLabel.frame =CGRectMake(80, 0, 213, nameSize.height);
    return cell;


【问题讨论】:

【参考方案1】:

你实现了方法吗

(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:

如果是,则在此执行删除并在此方法中重新加载。

【讨论】:

但我只能在CustomCell中进行删除。而且我没有选择单元格,我只在 CustomCell 中按下一个按钮。 你在调用方法[YourTableView reloadData];在 CustomCell 中,它将重新加载数据。 尝试使用单例对象,而不是每次都分配 Favorite *favController =[[Favorite alloc]init];拿共享控制器然后它应该可以工作。【参考方案2】:

您不能从自身重新加载单元格。据我收到您的问题,您需要为您的单元实现委托协议。按下星号时,调用 customcell.m 中按钮的方法,从 plist 文件中删除星号并执行其他操作。然后调用委托(您的视图)上的方法以重新加载该单元格。如果你不明白,我可以提供你的例子。

【讨论】:

以上是关于UITableView 无法从 CustomCell 重新加载数据的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0 无法从 UITableView 中删除一行

从 ViewController 到 UITableView 的 tableView 出口无效。插座无法连接到重复内容

带有多个自定义单元格的“UITableView 无法从其数据源获取单元格”

如果无法从 Firebase 实时数据库中检索数据,则尝试在 UITableView 上显示消息

UITableView 宽度约束无法正常工作

UICollectionView 内的 UITableView:无法设置值