2012-03-13 85 views
32

我有一个视图控制器显示一些信息(不是表视图)。重新加载ViewController

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

我该怎么办?

+2

你目前如何更新数据 - 我假设你正在使用viewDidAppear? – Till 2012-03-13 14:53:10

+0

您不能使用NotificationCenter或协议通知您的ViewController更新已结束吗? – Khal 2012-03-13 14:55:46

+0

@Khal我从来没有使用通知中心,你能指点我一个教程或指导? @Till我使用'viewWill/DidAppear'以及'loadView'和'viewDidLoad'。 – 2012-03-13 15:06:13

回答

23

你真的不需要做:

[self.view setNeedsDisplay]; 

老实说,我认为这是“让我们希望最好”的解决方案,在这种情况下。有几种方法来更新您的UIView S:

  1. 志愿
  2. 通知
  3. 代表团

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

+0

当我需要它时,我会用这个。 – 2012-06-27 14:56:33

+72

这个答案并没有真正回答这个问题。您提出了3种重新加载视图的方式,但是您没有详细说明甚至提供有关如何实施任何这些建议的信息的链接。 – Gogeta70 2013-05-01 21:26:56

+1

我想重新加载一个类似于推动新视图的动画子视图。 – 2015-06-17 11:36:35

2

更新数据...变化按钮titles..whatever的东西,你必须进行更新。

然后就叫

[self.view setNeedsDisplay]; 
+1

我必须从数据库中重新加载一些条目。我不认为重新提出意见是这里的方法。 – 2012-03-13 20:26:09

+0

@TiagoVeloso你是怎么解决这个问题的? – 2017-04-10 08:07:36

-5

必须使用

-(void)viewWillAppear:(BOOL)animated 

和像你想设置的条目...

+0

这可能是何时将请求发送到Web服务以加载数据的有效提示,但它不会回答如何异步处理Web服务响应以更新视图。 – 2013-10-08 13:52:29

21

,如果你知道你的数据库hasbee更新,您只想刷新viewcontrolle(这是我的情况太) 。我没有找到任何其它的解决办法,但我所做的是 当我更新数据库我叫

[个体经营的viewDidLoad];

再次,它的工作。 请记住,如果您覆盖其他viewWillAppear或loadView,然后以相同的顺序调用它们。 之类的。

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

但我认为应该有一个更具体的解决方案,如浏览器中的刷新按钮。 如果任何人有PLZ上传湾

1

重新初始化视图控制器

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

这是旧式的。故事板的现代项目很可能不会使用XIB;改为使用Storyboard。 – Raptor 2014-06-06 03:06:44

3

试试这个,你必须调用两种方法重载视图, 这一个对我的作品,

-Objective- ç

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

-Swift

self.viewDidLoad() 
self.viewWillAppear(true) 
+1

这是不正确的答案。当你调用viewDidLoad进行重新加载视图时,内存将随着你的应用程序的增加而增加。这是不正确的答案.. – Singapore 2017-04-14 09:20:36

+0

它仍然适用于其他所以请不要使downmark @新加坡 – 2017-09-07 12:50:03

+0

调用控制器生命周期方法根本不建议 – 2018-02-08 13:43:50

0

再次指向您的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) 
7

如果要重新加载的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 
    } 
} 
0

不建议您自己调用ViewDidLoad或ViewWillAppear。

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

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