2012-03-13 174 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()。