使用委托传递数据备份导航堆栈

我一直在争夺两个视图控制器之间的数据传递了两天,现在变得非常困惑。 我是Objective-C的新手,并且发现了一些棘手的部分让我头晕目眩。

我有一个导航控制器,FirstView是一个窗体,并在这个窗体上我有一个button,加载SecondView其中包含一个TableView供用户select一些选项。 然后,我想要将select传递回FirstView控制器并显示数据等…

我已经阅读了很多关于这个(stackoverflow,iphonedevsdk,CS 193P资源)和我见过的选项是,

1)ivar在应用程序委托(肮脏,不build议)2)创build一个单身人士3)创build一个数据模型类4)使用协议和代表(苹果推荐)

我想做的事情正确,并希望在我的程序中使用选项4 – 代表

问题是,我不了解代表以及如何设置和实施它们。

任何人都可以提供一个关于如何使用委托和2视图控制器来设置和传递NSArray的基本示例。

在此先感谢马特

委派是在这种情况下使用的正确模式,但是您的描述看起来不像委派,因为它使用全局variables。 也许你正在将全局variables存储在你的应用程序委托中,你应该尽量避免。

下面是代码应该看起来像一个粗略的轮廓:

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 

关掉我的头顶。 您可以将_returnedPropertyreplace为您的自定义对象,并在setReturnedProperty方法中实际分配表中的_returnedProperty值之前完成所有魔术。

 @interface FormController : UIViewController { NSString *_returnedProperty; } @property (nonatomic, retain) NSString *returnedProperty; @end @implementation FormController - (void)showChoices { TableController *tv = [[TableController alloc] initWithDelegate:self]; [self.navigationController pushViewController:tv animated:YES]; [tv release]; } - (void)setReturnedProperty:(NSString *)string { NSLog(@"Setting property as a delegate"); [_returnedProperty release]; _returnedProperty = [string retain]; } @synthesize returnedProperty=_returnedProperty; @end @interface TableController : UITableViewController { id _delegate } @end @implementation TableController - (id)initWithDelegate:(id)delegate { self = [super initWithStyle:UITableViewGroupedStyle]; if (!self) return nil; _delegate = delegate; return self; } - (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // do the data retrieval stuff NSString *returnedProperty = @"foo"; [_delegate setReturnedProperty:returnableProperty]; } @end 

同样的问题已经在这里回答了:

在许多UIVIewControllers之间传递一个variables

希望这将是简单和充分的一个…..

我结束了使用这个例子

在视图控制器和其他对象 @ iPhone Dev SDK 之间共享数据

工作得很好,并允许我在我的意见之间前后传递一个string和一个数组。

感谢你的帮助

你可以使用故事板很容易。 在SecondViewController的实现中使用它,并在VIewController.h (第一个视图的控制器)中创build一个名为dataFromSecondView

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { NSString *textvalue = self.SecondViewText.text; ViewController *destination = segue.destinationViewController; destination.dataFromSecondView = textvalue; }