UITableView和presentViewController需要2次点击才能显示

 手机用户2502905937_275 发布于 2023-02-13 15:04

我使用UITableView来呈现各种viewControllers.根据单击的索引,它将显示一个不同的视图控制器,然后可以将其解除.出于某种原因,我的一个ViewControllers需要两次点击才能显示.因此,似乎每个其他点击都有效.其他视图演示工作正常,所以表可能没问题.

我在ViewController中看到的即将显示的是,在第一次单击时,它通过didSelectRowAtIndexPath进行,然后在目标视图中触发:ViewWillLoad,ViewLoaded,ViewWillAppear ....但不是ViewDidAppear.在第二次单击时,只有ViewDidAppear会在显示时触发.在第二次单击时,它甚至没有通过didSelectRowAtIndexPath.此外,我可以第二次点击屏幕上的任意位置,它将显示.

它将继续来回执行此操作,似乎只显示每隔一次点击的目标视图.有没有想过为什么会这样?

/* RightPanelViewController */
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
switch(indexPath.row){
    case 0:
        // this view takes two clicks to display
        [self presentViewController:self.delegateRef.savedRidesViewController animated:YES completion:nil];
        break;
    case 1:
        // this works fine, as do others
        [self presentViewController:self.delegateRef.sensorsViewController animated:YES completion:nil];
        break;
    case 2:
       ...
}

/* savedRidesViewController */
- (void) viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated{
   [super viewDidAppear:animated];
}

AXE.. 56

看看这个:https://devforums.apple.com/thread/201431 如果你不想全部阅读 - 一些人(包括我)的解决方案是presentViewController在主线程上显式调用:

dispatch_async(dispatch_get_main_queue(), ^{
    [self presentViewController:myVC animated:YES completion:nil];
});

可能iOS7正在弄乱线程didSelectRowAtIndexPath.

3 个回答
  • 经过更多的调试,我能够确定它不是视图控制器,而是与didSelectRowAtIndexPath和presentViewController有关.它开始发生在我所呈现的其他观点上,而且不可靠.我也试过使用if/else代替switch而没有帮助.

    最终我发现这个解决方案能够解决它,但我不完全确定原因.通过无延迟地使用performSelector,所有视图立即加载(可能比没有它时更快?)并且每次都可靠地加载.

    它并不像代码一样干净,但它现在可靠地工作.我仍然很好奇为什么需要这样做.

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    
        switch(indexPath.row){
            case 0:
                [self performSelector:@selector(load0:) withObject:nil afterDelay:0];
                break;
            case 1:
                [self performSelector:@selector(load1:) withObject:nil afterDelay:0];
                break;
            case 2:
                [self performSelector:@selector(load2:) withObject:nil afterDelay:0];
                break;
            ...
        }
    }
    
    -(void)load0:(id)sender {
         [self presentViewController:self.delegateRef.zonesViewController animated:YES completion:nil];
    }
    -(void)load1:(id)sender {
         [self presentViewController:self.delegateRef.sensorsViewController animated:YES completion:nil];
    }
    -(void)load2:(id)sender {
         [self presentViewController:self.delegateRef.savedRidesViewController animated:YES completion:nil];
    }
    

    2023-02-13 15:07 回答
  • 看看这个:https://devforums.apple.com/thread/201431 如果你不想全部阅读 - 一些人(包括我)的解决方案是presentViewController在主线程上显式调用:

    dispatch_async(dispatch_get_main_queue(), ^{
        [self presentViewController:myVC animated:YES completion:nil];
    });
    

    可能iOS7正在弄乱线程didSelectRowAtIndexPath.

    2023-02-13 15:07 回答
  • 这是中的实际错误presentViewController:animated:completion:。在此处查看我的答案以及适当的解决方法:https : //stackoverflow.com/a/30787046/1812788

    2023-02-13 15:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有