4

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

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

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

我尝试了什么我找到了一些方法来做到这一点,但它们都很麻烦,我认为必须有一些合理的方法来做到这一点。

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

感谢你的帮助...

4

5 回答 5

2

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

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

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

它真的很容易实现,它使某些 ViewController 之间的依赖性降低。

于 2012-06-27T18:02:35.820 回答
2

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

希望有帮助!

于 2012-06-27T19:04:20.750 回答
2

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

以防上面的答案比您想要的要复杂一些,我建议在打开之前执行演示者方法的最简单方法是在演示者的 prepareForSegue 方法中执行此操作。如果需要向目标视图控制器发送数据,可以通过以下方式访问其属性:

ViewController *destinationVC = [segue destinationViewController];

打开后执行演示者方法的一种简单方法是:

ViewControllerSubclass *previousVC = [self presentingViewController];

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

抱歉,如果您已经知道这一切;通常很难推测需要什么级别的复杂性。

于 2012-06-27T19:32:02.333 回答
1

我在市场上几乎所有的应用程序中都遇到了这个问题。不同之处在于我从未决定走故事板的道路。

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

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

您的 optionsView 示例

@interface optionsViewController : UIViewController{
    UIViewController * myReactiveMainViewController;
}

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

在 optionsView 的 .m 文件中没有

#import "myMainViewController.h"

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

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

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

这个例子当然会假设您的 myMainViewController 实现了一个名为“someCall”的方法,该方法采用输入参数。

于 2012-06-27T18:04:55.070 回答
0

感谢您的回复。

我结束了

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

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

我相信其他建议也会起作用。

于 2012-07-19T19:16:58.213 回答