【问题标题】:Reloading a ViewController重新加载 ViewController
【发布时间】:2012-03-13 14:50:32
【问题描述】:

我有一个视图控制器显示一些信息(不是表格视图)。

我有一个对填充我数据库的远程服务器的更新调用。更新调用完成后,我想完全重新加载我的 ViewController。

我该怎么办?

【问题讨论】:

  • 您目前如何更新数据 - 我假设您正在使用 viewDidAppear?
  • 您不能使用 NotificationCenter 或协议来通知您的 ViewController 更新已结束吗?
  • @Khal 我从来没有用过通知中心,你能给我指个教程或指南吗? @直到我使用 viewWill/DidAppear 以及 loadViewviewDidLoad
  • 这里有一个关于 NSNotificationCenter 的教程:blog.shoguniphicus.com/2011/03/07/… 但为了您自己的记录,我宁愿使用一个协议来通知您的 ViewController 更新已经结束 ;)

标签: ios uiviewcontroller


【解决方案1】:

如果您知道您的数据库已更新,并且您只想刷新您的 ViewController(这是我的情况)。我没有找到其他解决方案,但我所做的是当我的数据库更新时,我打电话给:

[self viewDidLoad];

又一次,它奏效了。请记住,如果您覆盖其他 viewWillAppear 或 loadView,那么也以相同的顺序调用它们。 喜欢。

[self viewDidLoad]; [self viewWillAppear:YES];

我认为应该有一个更具体的解决方案,比如浏览器中的刷新按钮。

【讨论】:

  • 永远不要调用生命周期方法!!!以 [self.view setNeedsDisplay] 或 [self.view setNeedsLayout] 为例
【解决方案2】:

如果要重新加载最初从 XIB 加载的 ViewController,可以使用下一个 UIViewController 扩展:

extension UIViewController {
    func reloadViewFromNib() {
        let parent = view.superview
        view.removeFromSuperview()
        view = nil
        parent?.addSubview(view) // This line causes the view to be reloaded 
    }
}

【讨论】:

  • 嗨@juancazalla,我尝试了上面的sn-p来刷新我的视图控制器,所以它再次从控制器调用viewdidload()方法。如何逃避这个view did load 电话并刷新我的视图。
【解决方案3】:

你真的不需要这样做:

[self.view setNeedsDisplay];

老实说,我认为这是“让我们期待最好的”类型的解决方案,在这种情况下。有几种方法可以更新您的UIViews:

  1. KVO
  2. 通知
  3. 代表团

各有优劣。 根据您要更新的内容以及您的业务层(服务器连接)和UIViewController 之间的“连接”类型,我可以推荐一个适合您需求的。

【讨论】:

  • 我在需要的时候就选择了这个。
  • 这个答案并没有真正回答这个问题。您提出了 3 种重新加载视图的方法,但您没有详细说明,甚至没有提供有关如何实施这些建议的信息的链接。
  • 我想用类似于推送新视图的动画重新加载子视图。
【解决方案4】:

试试这个,你必须调用这两个方法来重新加载视图, 因为这个对我有用,

-Objective-C

[self viewDidLoad]; 
[self viewWillAppear:YES];

-斯威夫特

self.viewDidLoad()
self.viewWillAppear(true)

【讨论】:

  • 这不是正确的答案。当您调用 viewDidLoad 重新加载视图时,您的应用程序的内存将增加。这不是正确的答案..
  • 它仍然适用于其他人,所以请不要贬低@Singapore
  • 完全不推荐调用控制器生命周期方法
  • 那么有没有办法在不增加应用程序内存的情况下重新加载? @新加坡
【解决方案5】:

更新数据...更改按钮标题..您必须更新的任何内容..

然后打电话

[self.view setNeedsDisplay];

【讨论】:

  • 我必须从数据库中重新加载几个条目。我不认为重绘视图是要走的路。
【解决方案6】:

再次指向您的 ViewController。在我的情况下,[self.view setNeedsDisplay];[self viewDidLoad]; [self viewWillAppear:YES]; 不起作用,但下面的方法有效。

在目标 C 中

UIStoryboard *MyStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil ];
UIViewController *vc = [MyStoryboard instantiateViewControllerWithIdentifier:@"ViewControllerStoryBoardID"];
[self presentViewController:vc animated:YES completion:nil];

斯威夫特:

let secondViewController = self.storyboard!.instantiateViewControllerWithIdentifier("ViewControllerStoryBoardID")   
self.presentViewController(secondViewController, animated: true, completion: nil)

【讨论】:

  • 在我看来,“重新加载 ViewController”的最佳方法是简单地从内存中删除对象并创建一个全新的对象(如上所述)。这也会从 VC 中实例化的内存中删除 viewModel 等(假设没有循环引用问题)。仅仅切换视图并不能真正削减它,并且不考虑在正在刷新的 VC 之外运行的逻辑。
【解决方案7】:

不建议自己调用 ViewDidLoad 或 ViewWillAppear。

在 ViewDidLoad 中包含一个 loadData() 函数来准备数据。这是在初始运行时执行的。

当您想重新加载时,再次调用 loadData() 以从模型中获取数据。在 tableView 调用 reloadData() 或常规视图 setNeedsDisplay()。

【讨论】:

    【解决方案8】:

    重新初始化视图控制器

    YourViewController *vc = [[YourViewController alloc] initWithNibName:@"YourViewControllerIpad" bundle:nil];
    [self.navigationController vc animated:NO];
    

    【讨论】:

    • 这是老式的。带有故事板的现代项目很可能不会使用 XIB;改用故事板。
    【解决方案9】:

    对于UIViewController,只需再次加载您的视图 -

    func rightButtonAction() {
            if isEditProfile {
               print("Submit Clicked, Call Update profile API")
                isEditProfile = false
                self.viewWillAppear(true)
            } else {
                print("Edit Clicked, Call Edit profile API")
                isEditProfile = true
                self.viewWillAppear(true)
            }
        }
    

    我在配置文件编辑和查看配置文件上加载我的视图控制器。根据isEditProfile的Bool值更新viewWillAppear方法中的视图。

    【讨论】:

      【解决方案10】:

      你必须使用

      -(void)viewWillAppear:(BOOL)animated
      

      并根据需要设置条目...

      【讨论】:

      • 这可能是关于何时向 Web 服务发送请求以加载数据的有效提示,但它没有回答如何异步处理 Web 服务响应更新视图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 2011-11-17
      • 2011-06-22
      • 2015-01-26
      • 2018-12-16
      • 1970-01-01
      • 2014-05-09
      相关资源
      最近更新 更多