【问题标题】:Reload UITableView when navigating back?导航返回时重新加载 UITableView?
【发布时间】:2011-04-14 10:53:22
【问题描述】:

我有一个顶级UIViewController,其中包含UITableView。顶层UIViewController 实例化一个NavigationController,并将另一个UIViewController 推到NavigationController 上。 IE。我们进入一个新的、第二种观点。第二个视图在左上角有一个常用的“返回”按钮,可让您导航回顶层视图。

当从第二个视图导航回到顶层视图时,是否可以使用第二个视图中生成的数据在顶层视图中重绘UITableView,方法是在顶层调用cellForRowAtIndexPath 和如果是这样,如何做到这一点?

【问题讨论】:

    标签: iphone objective-c navigation


    【解决方案1】:

    您需要做的就是这个(在您的具有 UITableView 的 UIViewController 中)。此时您不必担心单元级别会发生什么。

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [self.tableView reloadData]; // to reload selected cell
    }
    

    只需将上面的代码添加到您的控制器,当您从第二个视图返回时,您就会发现正确的事情发生了。对reloadData 的调用告诉表格视图它需要从您的模型中刷新其单元格,其他一切都很好。

    【讨论】:

    • 我使用了这种方法,但不得不将代码从我的 didViewLoad 移动到 viewWillAppear,因为它们都在初始加载时触发。对我来说这是一个更大的问题,因为我需要从网络服务下载新项目的详细信息
    【解决方案2】:

    如果您只想重新加载选定的单元格,请在 UITableViewController 的自定义子类中覆盖 viewWillAppear:,如下所示:

    - (void)viewWillAppear:(BOOL)animated
    {
        NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow];
        [super viewWillAppear:animated]; // clears selection
        if (selectedRowIndexPath) {
            [self.tableView reloadRowsAtIndexPaths:@[selectedRowIndexPath] withRowAnimation:UITableViewRowAnimationNone];
        }
    }
    

    注意:假设您将clearsSelectionOnViewWillAppear 设置为YES(默认值),您必须在调用super 之前获取所选行的索引路径,这会清除选择。

    此外,只需调用[self.tablView reloadData]solution of @ZoranSimic 是可以接受的,因为它的代码更少且仍然有效。

    最后,让表格视图的单元格与它们所代表的模型对象保持同步的最佳方法可能是像 NSFetchedResultsController 一样使用键值观察 (KVO) 和/或 NSNotification 来通知您的表格视图当模型对象发生变化时,控制器可以重新加载相应的单元格。表格视图控制器可以在viewDidLoad 中开始观察其模型对象的更改,并在dealloc(以及您在manually unload self.view 的任何位置)中结束观察。

    【讨论】:

      【解决方案3】:

      这里除了answer of Zoran Simic Swift 代码:

      override func viewWillAppear(animated: Bool) {
          super.viewWillAppear(animated)
          tableView.reloadData()
      }
      

      【讨论】:

      • 当你想从viewWillAppear()重新加载数据时,注意不要从viewDidLoad()获取数据。
      • "仅警告一次:UITableView 被告知要在视图层次结构中布局其可见单元格和其他内容(表视图或其超级视图之一尚未添加到窗口中) . 这可能会在没有准确信息的情况下强制表格视图内的视图加载和执行布局(例如表格视图边界、特征集合、布局边距、安全区域插入等),从而导致错误,并且还会由于额外的布局而导致不必要的性能开销通过。”
      【解决方案4】:

      您可以实现UINavigationControllerDelegate 的方法并创建弹出视图控制器时的刷新逻辑。

      另一种方法是在您的表视图控制器上实现viewWillAppear 上的一些逻辑,以根据弹出视图控制器的数据进行刷新。

      如果您需要将数据从第二个视图控制器发送到第一个视图控制器,请记住您的第二个视图控制器“不”知道前一个视图控制器的存在。它应该是透明的。您应该实现一些协议以使第二个视图控制器向第一个视图控制器发送数据。这将是此问题的第三种选择,因为您的第一个视图控制器将是委托,而第二个视图控制器将向委托发送信息,您可能正在准备您的表视图(第一个视图控制器)以重新加载,基于收到数据。

      【讨论】:

        【解决方案5】:

        viewWillAppear 每次视图出现时都会被调用,包括第一次。 这是我仅在您向后导航时重新加载视图的解决方案

        我在ViewController.h file 中创建了一个变量,用于检查这是我第一次访问ViewController 还是返回时

        @property (nonatomic) BOOL isViewExist;
        

        之后在viewWillAppear

        -(void)viewWillAppear:(BOOL)animated{
            if(!self.isViewExist){
                self.isViewExist = YES; // check it is the first time you go to this ViewController -> don't reload anything
            }else{
                [self.tableView reloadData]; // to reload the tableview data
                // or your can refresh anything in your ViewController as you want
            }
        }
        

        希望有帮助

        【讨论】:

          【解决方案6】:

          也许现在可以提供帮助。

          对于 Swift 2+

          在你的 viewDidAppear 方法中:

          如果要重新加载所有表:

          tableView.reloadData()
          

          如果您只想重新加载选定的单元格。

          let index = tableView.indexPathForSelectedRow
          if (index != nil){
            self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic)
          }
          

          【讨论】:

            【解决方案7】:

            为 Swift 3 更新

            let index = tableView.indexPathForSelectedRow
                if (index != nil){
                    self.tableView.reloadRows(at: [index!], with: UITableViewRowAnimation.automatic)
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-07-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-04-03
              • 1970-01-01
              相关资源
              最近更新 更多