如何阻止 UITableView 单元格在视图更改时消失

Posted

技术标签:

【中文标题】如何阻止 UITableView 单元格在视图更改时消失【英文标题】:How to stop UITableView Cells from disappearing on view change 【发布时间】:2015-02-26 17:43:24 【问题描述】:

我在使用addSubView 更改容器视图的视图时遇到了一个奇怪的错误,UITableView 的内容消失了。

这个 UITableView 是动态的,我从数组中设置单元格。目前没有使用数组的内容,它只是计算数组的长度并生成该数量的单元格。

从start of this video 可以看出,表格视图在第一个视图上加载良好。但是当我将容器视图的内容更改为另一个视图然后再返回时,单元格似乎加载了,然后消失了!

我正在使用自定义 Segue 使用以下代码更改菜单按钮点击的视图

-(void) perform 
    HomeViewController *src = (HomeViewController *)[self sourceViewController];
    UIViewController *dst = (UIViewController *)[self destinationViewController];

    //Clear view of all subviews
    for (UIView *view in src.placeholderView.subviews) 
        [view removeFromSuperview];
    
    //save destination
    src.currentViewController = dst;

    //set placeholderOutlet to destination
    [src.placeholderView addSubview:dst.view];
 

UITableViewController 内的代码如下。

- (void)viewDidLoad 
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;


    NSMutableArray *thisBlocks = [NSMutableArray arrayWithCapacity:7];

    Blocks *block = [[Blocks alloc] init];
    block.ID = @"232323";
    block.Name = @"128 Some Road";

    [thisBlocks addObject:block];

    block = [[Blocks alloc] init];
    block.ID = @"140332";
    block.Name = @"12 Another Road";
    [thisBlocks addObject:block];

    block = [[Blocks alloc] init];
    block.ID = @"889752";
    block.Name = @"Quadrant Square";
    [thisBlocks addObject:block];

    block = [[Blocks alloc] init];
    block.ID = @"1403323";
    block.Name = @"12 Some Road";
    [thisBlocks addObject:block];

    block = [[Blocks alloc] init];
    block.ID = @"8897522";
    block.Name = @"Quadrant Square";
    [thisBlocks addObject:block];

    block = [[Blocks alloc] init];
    block.ID = @"1403392";
    block.Name = @"12 Another Road";
    [thisBlocks addObject:block];

    block = [[Blocks alloc] init];
    block.ID = @"8897520";
    block.Name = @"Quadrant Square";
    [thisBlocks addObject:block];

    self.blocks = thisBlocks;

    //NSLog(@"array: %@", self.blocks);

    //NSLog(@"Rows : %lu", (unsigned long)[self.blocks count] );


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    // Return the number of sections.
    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    // Return the number of rows in the section.

    return [self.blocks count];



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


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BlockCell"];


    return cell;

这真的让我很难过。有什么想法吗?

【问题讨论】:

您的表视图控制器是否正在被释放(实现 dealloc 并在其中放置日志以查看它是否被调用)? 只是猜测:当您返回 tableview 时,您的“perform”方法是否执行?这样 tableview 将被加载、填充然后“执行”通过它的子视图 ([view removeFromSuperview];) 快速枚举破坏你所有的辛勤工作,以便删除 tableview? 我认为 rdelmar 拥有它。我让我的 ViewController 设置了一个(weak, nonatomic)。将其更改为 `(strong, nonatomic) 解决了这个问题。谢谢 【参考方案1】:

rdelmar 拥有它。我让我的 ViewController 设置了一个(弱的,非原子的)。将其更改为 `(strong, nonatomic) 解决了这个问题。谢谢 – Glenn Flanagan 43 秒前编辑

【讨论】:

以上是关于如何阻止 UITableView 单元格在视图更改时消失的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的单元格在我的 UITableView 中显示为空白?

UITableView 单元格在向下滚动然后备份后消失

为啥我的 UITableView 单元格在滚动时重叠?

用于 UITableView 的自定义 XIB 单元格在滚动时卡住/卡住

ios 7 uitableview 所选单元格在 beginupdates 后失去边框

uitableview 自定义单元格在向下滚动 uitableview 时丢失其内容