非常基本的objective-c问题——如何让不同的视图共享信息?

Posted

技术标签:

【中文标题】非常基本的objective-c问题——如何让不同的视图共享信息?【英文标题】:Very basic objective-c question-how do I make different views share information? 【发布时间】:2010-12-20 20:50:46 【问题描述】:

所以,基本上,我有四个不同的视图,它们通过屏幕底部的标签栏切换。我为每个视图控制器设置了一个视图控制器,它们都工作正常。唯一的问题是我不知道如何在不同的视图之间共享信息——例如,我有一个 IBAction,它接受 UISegmentedControl 的输出并将选择存储为整数 (1,2,3,4) .问题是,我不知道如何从第一个视图控制器(实际处理该信息的那个)访问该整数。我确定这是一个非常基本的问题,但我的 google-fu 似乎在这里不起作用。谢谢!

【问题讨论】:

没人知道。它太复杂了,而且一直在变化! :) 【参考方案1】:

使用 MVC 方法,信息不应存储在视图控制器中。你应该有一个单独的对象来存储信息,视图控制器加载它,视图显示它。最简单的方法是将信息存储在应用程序的委托中。然后,每当视图控制器需要查找/更改某些信息时,它可以使用[[UIApplication sharedApplication] delegate] 获取委托,并根据需要加载/更改信息。在 viewDidLoad 或 viewWillDisplay: 中加载更新显示的信息,并在 action 方法中进行更改。

编辑示例:

DelegateClass.h

@interface DelegateClass : NSObject 
    //ivars
    float number1;

@property (assign) float number1;
...
@end

DelegateClass.m

#import "DelegateClass.h"
@implementation DelegateClass
@synthesize number1;
...
@end

MyViewController.m

#import "DelegateClass.h"
@implementation MyViewController
- (void)viewDidLoad 
    [super viewDidLoad];
    DelegateClass *delegate = [[UIApplication sharedApplication] delegate];
    float number1 = delegate.number1;
    ...

- (IBAction)actionMethod:(id)sender 
    float number1 = sender.floatValue;//get new value
    ((DelegateClass*)[[UIApplication sharedApplication] delegate]).number1 = number1;

...
@end

【讨论】:

好的,这已经让我走得最远了……再说一次,我是这方面的真正初学者,那么我如何从中获得价值呢?如果我将一个函数添加到应用程序委托 -(void)function1;,然后我在其他地方执行此操作,如 [[[UIApplication sharedApplication] delegate] function1];,它编译正常,但我收到警告,“'function1'在协议中找不到”,我仍然不知道如何在应用程序委托中获取或设置变量。假设我有一个名为“number1”的浮点数,我该怎么做 number1=1.0;或数字2=数字1;在应用程序委托之外? 要消除您的错误,请包含委托的头文件并将 delegate 的结果转换为该类。我将添加一个获取/设置委托属性的示例。 好的,我正在进一步,但现在我收到错误“警告:类型'id '不符合'UITabBarControllerDelegate'协议”。 尝试转换为 id 抱歉,我不知道该怎么做。 :\【参考方案2】:

您可以让您的视图将其变量公开给UITabBarControllerUITabBarController 可以具有这些视图可以调用以查看这些变量的方法。

或者,您可以让您的视图直接设置UITabBarController 中的变量值。不推荐(虽然少了很多打字:)

顺便说一句,刚刚在 Google 上快速搜索了一下,发现了这个:Accessing parent view controller (custom) properties。看起来那里有示例代码。 :)

希望这会有所帮助!

【讨论】:

好的,问这个我觉得很愚蠢,但是我如何以编程方式访问 UITabBarController(只有应用程序委托和所有视图的代码,但没有 UITabBarController 本身的代码)?我是否只是为它创建一个类,然后在界面生成器中将类从“UITabBarController”更改为我的自定义类?这就是我控制这些视图的方式。 另外,一个同样愚蠢的问题,我怎么称呼我的观点的实例?我所做的只是为它们编写代码,但我从未明确声明它们/给它们命名。由于这似乎是自动发生的,所以我不知道在查找变量的值时要使用什么。我知道它看起来像“newvalue=????.selectorValue”,但我不知道 ????是,当从视图访问值或视图从 UITabBarController 访问变量时。 我建议查看下面 user387184 的代码。他正在使用应用程序委托来存储全局可访问的数据。不过,这样做的一个缺点是代码不可移植(我以前曾走这条路)。【参考方案3】:

我在所有应用程序中都使用了一个通用主题,其中我有某些数据需要在所有主要类中实际访问。我发现它真的很容易使用并且几乎没有错误。 (再次感谢论坛里所有的人提出了这个超级想法!)

我在所有需要它的类中声明了这个变量...

  @class WebiDataManager;

  @interface FirstViewController : UIViewController<MFMessageComposeViewControllerDelegate, SetupDelegate>  
        WebiDataManager         *webiDataManager;
    ...

在这段代码中,我从 AppDelegate 中得到它...

#import "WebiAppDelegate.h"

 - (void)viewWillAppear:(BOOL)animated 
        //  D_IN;
        [super viewWillAppear:animated];


        //get the dataManager global Object, so we always have a structured accesss to the data!
        WebiAppDelegate *mainDelegate = (WebiAppDelegate *)[[UIApplication sharedApplication]delegate];
        self.webiDataManager = mainDelegate.webiDataManager;

顺便说一句,这对 coredata 也很有效,因为通过这个全局变量我总是可以访问所有主要的 coredata。

希望我能解释清楚...

【讨论】:

以上是关于非常基本的objective-c问题——如何让不同的视图共享信息?的主要内容,如果未能解决你的问题,请参考以下文章

*应该*崩溃的简单Objective-C过度发布不会崩溃。为啥?

如何让 XCode 构建一个包含 Objective-C++ 的项目?

系统声音通过扬声器非常安静地播放 - C,Objective-C

如何让lldb打印写在Objective-C类别中的描述

如何让音乐开/关设置objective-c

Objective-C:如何让它为 NSCoding 保存两个文件而不是一个文件?