UIViewControllers之间的通信

时间:2012-06-27 17:52:21

标签: objective-c ios

我是Objective-C的新手,所以为一个愚蠢的问题道歉。

我从主视图控制器打开“选项”视图控制器。两者都建在故事板中。在呈现选项控制器之前和之后,我需要在主视图控制器上停止并启动计时器。选项控制器关闭后(一个按钮调用dismiss)我需要将一些信息发送回我的主控制器或者至少让我的主控制器知道它需要刷新一些值。

  
    
      

主要问题       在打开之前和之后呈现视图控制器并执行某些演示者方法的最佳方法是什么?

             

我做了什么       我发现了一些方法,但它们都很麻烦,我认为必须有一些合理的方法。

    
  
  1. 理想情况下,我想使用我在两个控制器之间的故事板中设置的segue。
  2. 我设法通过访问storyboard并调用instantiateViewControllerWithIdentifier以编程方式调用选项控制器。它工作但看起来有点复杂。
  3. 我无法在UIViewController上找到委托方法来处理dismiss事件
  4. 当我尝试通过presentViewController访问选项控制器中的主控制器并向下转换它时,我通过两次包含我的.h文件得到了一个链接错误(不确定使用#define的Obj-C标准是什么)。
  5. 感谢您的帮助......

5 个答案:

答案 0 :(得分:2)

所有这些都可以通过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对其进行编码,然后在需要时对其进行解码。它对我很有用。

希望有所帮助!

答案 1 :(得分:2)

  

主要问题在开幕前后呈现视图控制器和执行某些演示者方法的最佳方法是什么?

如果上面的答案比你想要的更复杂,我建议在打开之前执行演示者方法的最简单方法是在演示者的prepareForSegue方法中这样做。如果需要将数据发送到目标视图控制器,可以通过以下方式访问其属性:

ViewController *destinationVC = [segue destinationViewController];

打开后执行演示者方法的简便方法是:

ViewControllerSubclass *previousVC = [self presentingViewController];

然后使用类或实例来执行您的类或实例方法。您可以在目标的viewWillAppear中执行此操作。

对不起,如果你已经知道这一切;通常很难推测出需要什么样的复杂程度。

答案 2 :(得分:1)

对于弱链接的ViewControllers之间的通信,您可以使用NSNotificationCenter:

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

在这里,您可以向所有需要处理一些更改的ViewControllers发送消息(例如,更改字体大小的选项)。

它实现起来非常简单,它可以使某些ViewController相互依赖。

答案 3 :(得分:1)

我已经遇到了几乎我在市场上的每个应用程序。差异是我从未决定沿着故事板路走下去。

我一直能够实现这一目标的方法是在控制器之间提供访问器功能。通过将交叉定义的控制器定义为选项视图头中的UIViewController类型,然后仅在.m文件中包含主视图控制器的头,可以解决链接器问题。现在,当您从选项视图中调用主视图控制器例程时,您必须将其转换为主视图控制器的类型!

您还必须在选项视图中提供一个例程,该例程允许您设置将指向主视图控制器的指针变为自身的变量。

optionsView的示例

@interface optionsViewController : UIViewController{
    UIViewController * myReactiveMainViewController;
}

-(void)setMyReactiveMainViewController:(UIViewController *)controller;

在.View文件中没有用于optionsView

#import "myMainViewController.h"

-(void)setMyReactiveMainViewController:(UIViewController *)controller{
    myReactiveMainViewController = controller;
}

在对主视图控制器的任何其他回调中,您必须这样做:

-(void)returnToMain{
    [(myMainViewController *)myReactiveMainViewController someCall:variable];
}

这个例子当然会假设你的myMainViewController实现了一个带有输入参数的名为“someCall”的方法。

答案 4 :(得分:0)

感谢您的回复。

我最终得到了

  1. 调用prepareForSegue执行转换前代码

  2. 在释放呈现的视图控制器时,在presentViewController上调用performSelector。

  3. 我相信其他建议也会奏效。

相关问题