簡體   English   中英

UIViewControllers之間的通信

[英]Communication between UIViewControllers

我對Objective-C並不陌生,因此對一個愚蠢的問題表示歉意。

我正在從主視圖控制器中打開“選項”視圖控制器。 兩者都內置在情節提要中。 在介紹選項控制器之前和之后,我需要在主視圖控制器上停止並啟動計時器。 關閉選項控制器后(一個按鈕調用dismiss),我需要將一些信息發送回我的主控制器,或者至少讓我的主控制器知道它需要刷新一些值。

主要問題在打開之前和之后展示視圖控制器並執行某些演示者方法的最佳方法是什么?

我嘗試過的方法我找到了幾種方法,但是它們都很麻煩,我認為必須有一些可行的方法。

  1. 理想情況下,我想使用我在兩個控制器之間的情節提要中設置的segue。
  2. 我設法通過訪問情節提要並調用InstantiateViewControllerWithIdentifier來以編程方式調用選項控制器。 它有效,但看起來有點復雜。
  3. 我無法在UIViewController上找到委托方法來處理dismiss事件
  4. 當我嘗試通過presentingViewController訪問並降級訪問選項控制器中的主控制器時,由於兩次包含.h文件而出現鏈接錯誤(不確定使用#define的Obj-C標准是什么)。

感謝你的幫助...

使用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:

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html

在這里,您可以向所有正在監聽的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”的方法,該方法具有輸入參數。

感謝您的答復。

我最終以

  1. 調用prepareForSegue執行預轉換代碼

  2. 釋放呈現的視圖控制器時,在presentingViewController上調用performSelector。

我相信其他建議也會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM