[英]Switching between UIViewControllers with UISegmentedControl
[英]Communication between UIViewControllers
我對Objective-C並不陌生,因此對一個愚蠢的問題表示歉意。
我正在從主視圖控制器中打開“選項”視圖控制器。 兩者都內置在情節提要中。 在介紹選項控制器之前和之后,我需要在主視圖控制器上停止並啟動計時器。 關閉選項控制器后(一個按鈕調用dismiss),我需要將一些信息發送回我的主控制器,或者至少讓我的主控制器知道它需要刷新一些值。
主要問題在打開之前和之后展示視圖控制器並執行某些演示者方法的最佳方法是什么?
我嘗試過的方法我找到了幾種方法,但是它們都很麻煩,我認為必須有一些可行的方法。
感謝你的幫助...
使用Storyboard和NSNotificationCenter
以及NSCoding可以很容易地完成所有這些工作。 在主控制器的viewDidLoad
方法中,輸入以下代碼:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveNotification:)
name:@"Update"
object:nil];
然后在同一控制器中創建此方法:
(void)receiveNotification:(NSNotification*)notification
{
//...
}
要從選項控制器更新主控制器時:
[[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self];
另外,我建議對基本數據持久性使用NSArchiving
。 剛找到本教程,看起來還不錯。 http://samsoff.es/posts/archiving-objective-c-objects-with-nscoding
基本上,創建一個可以存儲信息的對象,使用nscoding對其進行編碼,然后在需要時對其進行取消編碼。 它對我來說很棒。
希望有幫助!
主要問題在打開之前和之后展示視圖控制器並執行某些演示者方法的最佳方法是什么?
萬一上面的答案比您想要的要復雜得多,我建議在打開演示者的方法之前,最簡單的方法就是在演示者的prepareForSegue方法中執行。 如果需要將數據發送到目標視圖控制器,則可以通過以下方式訪問其屬性:
ViewController *destinationVC = [segue destinationViewController];
打開后執行演示者方法的簡單方法是:
ViewControllerSubclass *previousVC = [self presentingViewController];
然后使用類或實例執行您的類或實例方法。 您可以在目標的viewWillAppear中執行此操作。
對不起,如果您已經知道所有這些; 通常很難推測需要什么級別的復雜性。
對於弱鏈接的ViewController之間的通信,可以使用NSNotificationCenter:
在這里,您可以向所有正在監聽的ViewController發送一條消息,這些消息需要進行一些更改(例如,更改字體大小的選項)。
這真的很容易實現,並且使某些ViewController相互之間的依賴性降低。
我在市場上幾乎所有的應用程序中都遇到了這種情況。 所不同的是,我從未決定沿着故事板走下去。
我一直能夠做到這一點的方法是在控制器之間提供訪問器功能。 通過將交叉定義的控制器定義為選項視圖頭中的UIViewController類型,然后僅將主視圖控制器的頭包括在.m文件中,可以解決鏈接器問題。 現在,當您從選項視圖調用主視圖控制器例程時,必須將其強制轉換為主視圖控制器的類型!
您還必須在選項視圖中提供一個例程,該例程將允許您將將指向主視圖控制器的指針的變量設置為self。
您的選項示例查看
@interface optionsViewController : UIViewController{
UIViewController * myReactiveMainViewController;
}
-(void)setMyReactiveMainViewController:(UIViewController *)controller;
.m文件中的optionsView否
#import "myMainViewController.h"
-(void)setMyReactiveMainViewController:(UIViewController *)controller{
myReactiveMainViewController = controller;
}
在任何其他打回主視圖控制器的調用中,您都必須這樣做:
-(void)returnToMain{
[(myMainViewController *)myReactiveMainViewController someCall:variable];
}
該示例當然會假定myMainViewController實現了一個稱為“ someCall”的方法,該方法具有輸入參數。
感謝您的答復。
我最終以
調用prepareForSegue執行預轉換代碼
釋放呈現的視圖控制器時,在presentingViewController上調用performSelector。
我相信其他建議也會起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.