非常基本的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 您可以让您的视图将其变量公开给UITabBarController
。 UITabBarController
可以具有这些视图可以调用以查看这些变量的方法。
或者,您可以让您的视图直接设置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++ 的项目?