从弹出的视图控制器传递数据

时间:2011-07-27 19:28:06

标签: ios objective-c uinavigationcontroller

我有两个视图控制器。我是第一个,当我按下按钮时,第二个视图控制器被推到导航控制器的堆栈上。这里,在第二个视图控制器中我有一个表视图,当我点击某些行时,它们被选中(如复选框),并且与这些行相关的一些数据被添加到数组中。现在,当我完成选择时,我想回到第一个视图控制器并使用该数组。怎么做?现在我的应用程序是这样的:我有一个委托协议,然后我有属性数组的对象,我可以从整个应用程序访问该对象及其数组...但我真的不喜欢这样。这是正确/最好/最简单的方法吗?

2 个答案:

答案 0 :(得分:6)

  

我有一个委托协议,然后我拥有属性数组的对象,我可以从整个应用程序访问该对象及其数组......但我真的不喜欢它。这是正确/最好/最简单的方法吗?

委派是在这里使用的正确模式,但是你所描述的并不是委托,而是使用全局变量。也许你将全局变量存储在App Delegate中 - 如果可以,通常可以避免。

以下是代码应该是什么样子的大致轮廓:

SecondViewController.h:

@protocol SecondViewControllerDelegate;

@interface SecondViewController;

SecondViewController : UIViewController
{
    id<SecondViewControllerDelegate> delegate;

    NSArray* someArray;
}

@property (nonatomic, assign) id<SecondViewControllerDelegate> delegate;
@property (nonatomic, retain) NSArray* someArray;

@end

@protocol SecondViewControllerDelegate
- (void)secondViewControllerDidFinish:(SecondViewController*)secondViewController;
@end

SecondViewController.m:

@implementation SecondViewController

@synthesize delegate;
@synthesize someArray;

- (void)dealloc
{
    [someArray release];
    [super dealloc];
}

- (void)someMethodCalledWhenUserIsDone
{
    [delegate secondViewControllerDidFinish:self];
}

FirstViewController.h:

#import SecondViewController

@interface FirstViewController : UIViewController <SecondViewControllerDelegate>
{
    ...
}

@end

FirstViewController.m:

@implementation FirstViewController

- (void)secondViewControllerDidFinish:(SecondViewController*)secondViewController
{
    NSArray* someArray = secondViewController.someArray
    // Do something with the array
}

@end

答案 1 :(得分:0)

您需要reference secondViewController,并为其创建一个对象。

secondViewController *object2 = [[SecondViewController alloc] init];

object2.thatArray将拥有数组的内容。离开该视图控制器时,确保数组保留其值(或者您可以在AppDelegate中创建该数组,以便所有viewControllers都可以访问它。)