iPhone视图控制器

3

我正在创建一个应用程序,需要从16个UITextFields中传递数据,以类对象的形式将它们存储在数组中,并在其他viewController中显示该数组中的所有对象。

如何从一个viewController传递数据到另一个viewController

6个回答

2
假设您有两个名为viewController1viewController2的视图控制器。在viewcontroller2中有一个NSArray的实例变量textData。确保将@property@synthesize添加到变量中。在viewController2init方法中分配数组,然后可以通过以下方式将数组从第一个视图控制器传递到第二个视图控制器:
viewController2.textData = viewController1.textArray;

1

通常,不相关的视图控制器之间的通信是丑陋设计的症状。我会避免这种情况。

单例对象可能是您最好的选择。绝对不要使用应用程序的委托或NSUserDefaults来共享对象之间的数据。同样适用于将数据保存在磁盘上的plist中,并从其他控制器重新加载它。这只是极其糟糕的设计。

顺便说一下:无论您的技能水平如何,请获取此书,Cocoa Design Patterns。虽然它与iPhone开发没有直接关系,但它以清晰的方式解释了Cocoa的设计和模式。理解它将有助于您在设计未来的应用程序时获得很多帮助。


0

有很多方法可以实现这个。这完全取决于您需要对数据做什么以及需要存储多长时间等。

  • 您可以拥有一个保持数据的单例类 - 单例可以从应用程序的任何地方访问。
  • 您可以将数据存储在应用程序委托中。它也可以从应用程序的任何地方访问:[[UIApplication sharedApplication] delegate]
  • 您的视图控制器可以直接相互通信。
  • 您可以将数据存储为用户默认值(NSUserDefaults
  • 您可以将数据存储在文件中(可能是 plist?)

1
你可以将数据存储为用户默认设置 (NSUserDefaults),但最好不要这样做。NSUserDefaults 旨在存储用户首选项,而不是任何数据。 - ySgPjx
使用单例类?这是可能的吗?我对这项技术还很陌生。我从Java转过来的。 - Shabbir Panjesha
这是我用来创建单例的宏:https://github.com/cjhanson/Objective-C-Optimized-Singleton - iceydee

0

在视图控制器之间传递过多的信息是一个糟糕的模型-视图-控制器设计的明显标志。您的应用程序逻辑应尽可能地下推到域层。

我猜您正在实现某种向导功能。引入一个新的FooWizardState域对象,并将其从一个视图控制器传递到另一个视图控制器。这样,如果需要,您可以轻松地将第一个视图控制器从16个文本字段拆分为每个控制器8个文本字段,或者根据客户需求进行更改。

使用此设计,您还可以轻松更改向导中的任何一个视图控制器,以便符合iPad / iPhone用户界面习惯。


0

你可以在第二个视图控制器中声明数组,并设置属性和合成,然后通过以下方式从第一个视图控制器传递数据到第二个:

secondviewcontroller *obj = [[secondviewcontroller alloc]init];
obj.array = data;

那是传统的C++方式。我想用id<protocol>的Obj-C方式。 - Shabbir Panjesha

0

你可以用简单的方法来实现。在第一个控制器(例如FirstViewController)中,你可以将所有字段存储在一个数组中:

NSArray *_fields;

然后,您可以通过@property结构使数组可访问:

@property (readonly) NSArray *fields;

在.m实现中,您可以通过@synthesize调用使它们可用:

@synthesize fields = _fields;

在第二个控制器(例如SecondViewController)中,您应该使用与上述结构相同的指针指向第一个控制器:
FirstViewController *_controller;

那么

@property(nonatomic, retain) FirstViewController *controller;

在 .m 文件中,您将会有:

@synthesize controller = _controller;

当您创建第二个控制器时,您将需要保存指向第一个控制器的指针。例如:

FirstViewController *first = [[FirstViewController alloc] init];
SecondViewController *second = [[SecondViewController alloc] init];
second.controller = first;

那么您将能够使用second.controller.fields来读取第一个控制器中的UITextField实例。

关于什么?问吧,我会回答的...我纠正了一些东西,使它更清晰。 - marzapower
在哪里定义FirstViewController和SecondViewController?是在MainWindow.xib文件中吗? - Shabbir Panjesha
你应该将它们定义为继承自 UIViewController 类的类,如果需要,可以使用通过 Interface Builder 创建的新 .nib 文件来实例化它们。 - marzapower
我尝试过那个......我的应用程序有16个UITextFields,我已将它们分成了2个viewController。我认为我的代码搞砸了。 - Shabbir Panjesha
你把那16个UITextFields放在哪里了?是通过编程定义还是通过IB?如果是后者,你修改的是哪个控制器? - marzapower

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接