2012-11-17 48 views
1

我有一個方法,當在我的根視圖中點擊一個設置按鈕時,該子類將兩個UIViewControllers附加到一個UITabBarController並將UITabBarController推到導航棧上:UITabBarController似乎打開一個視圖,然後關閉另一個視圖

-(IBAction)onSettings:(id)sender { 
// Create the Settings Views 
SettingsViewController *vcSettings1 = [[Settings1ViewController alloc] initWithNibName:@"Settings1ViewController" bundle:nil]; 
Settings2ViewController *vcSettings2 = [[Settings2ViewController alloc] initWithNibName:@"Settings2ViewController" bundle:nil]; 

// Create the Tab View 
UITabBarController *tabController= [[UITabBarController alloc] init]; 
tabController.viewControllers = @[vcSettings1,vcSettings2]; 

// Pass the Index of the database on to the views so they can pull the record from the database 
vcSettings.recordIndex = recordIndex; 
vcSettings2.recordIndex = recordIndex; 

// Add the tab bar controller to the navigation stack 
[self.navigationController pushViewController:tabController animated:YES]; 
} 

在每個設置視圖中,我重寫viewWillAppear方法以從主鍵recordIndex處的sqlite數據庫加載一行數據。 (這兩個視圖都拉同一條記錄,並顯示記錄中的不同數據,除了兩個字段相同。)

我還覆蓋了每個視圖中的viewWillDisappear以將控件數據保存回數據庫。

我可以驗證每次使用標籤欄切換視圖時,在一個關閉視圖上調用viewWillDisappear方法,並在打開視圖上調用viewWillAppear。

問題是,當我在第一個視圖上更改數據並切換到第二個視圖時,第二個視圖上的數據不會更改,除非我返回到第一個視圖,然後返回到第二個視圖。盡我所能,這裏是似乎正在發生的事情:

  1. 查看1已打開。我改變了現場的數據。
  2. 我點擊查看2的選項卡
  3. viewWillAppear被稱爲查看2,用數據庫中的舊數據填充查看2中的字段。
  4. viewWillDisappear然後調用View 1,將更改的數據保存到數據庫。

看來,開放視圖調用viewWillAppear之前,關閉視圖調用viewWillDisappear。

我已經嘗試了其他方式,例如使用單例,並試圖從兩個視圖修改recordIndex,並且在所有情況下,似乎數據都是從關閉視圖保存之前從開始視圖加載的。

這是一個UITabBarController工作方式的錯誤,還是我濫用viewWillAppear和消失的方式,我不應該?有沒有其他人跑過這種行爲?

回答

1

這不是一個好設計。不能保證viewWillAppear的新視圖應該在viewWillDown從前一個顯示之後調用。即使這樣做,也不能保證這會在未來的iOS版本中繼續工作。

如果性能沒有受到影響,快速修復可能是在數據庫發生更改時保存更改,您將始終擁有可在任何情況下從任何視圖訪問的最新數據庫。

最好的設計是有一些模型類,例如你的模型對象可以通過單例訪問。這些模型對象在您與UI進行交互時會實時更新,它們是由不同視圖訪問的模型對象,並且使用您選擇的方法定期保存它們。

+0

感謝JP同意,我喜歡「更新的變化是由」的想法更好,然後我在做什麼,和你對,這似乎應該是未來證明應用程序很好。非常感激! –

0

作爲一種廉價的解決方案,你可以在viewDidAppear加載數據,但總體上我與日本的答案

相關問題