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

时间:2011-03-09 11:03:51

标签: objective-c ios delegates uinavigationcontroller

我一直在与两个视图控制器之间传递数据进行斗争几天,并且变得非常困惑。我是Objective-C的新手,并且发现了一些棘手的问题让我不知所措。

我有一个导航控制器,FirstView是一个表单,在这个表单上我有一个加载SecondView的按钮,其中包含一个TableView供用户选择一些选项。然后我想将选择传递回FirstView控制器并显示数据等......

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

1)app代表中的ivar(脏而不推荐) 2)创建一个单身人士 3)创建数据模型类 4)使用协议和代表(由Apple推荐)

我想做正确的事情,并希望在我的计划中使用选项4 - 代表

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

是否有人可以提供有关如何使用委托和2个视图控制器设置和传递NSArray的基本示例。

提前致谢 马特

5 个答案:

答案 0 :(得分:30)

委托是在这种情况下使用的正确模式,但是您的描述看起来不像委托,因为它使用全局变量。也许你将全局变量存储在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 :(得分:1)

脱离我的头顶。您可以将_returnedProperty替换为自定义对象,并在setReturnedProperty方法中执行所有操作,然后再从表中实际分配选中的值。

@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

答案 2 :(得分:1)

这里也回答了同样的问题:

Pass a variable between lots of UIVIewControllers

希望这将是简单的&amp; amp;足够的......

答案 3 :(得分:1)

我最终使用了这个例子

Sharing data between view controllers and other objects @ iPhone Dev SDK

工作得很好,允许我在我的观点之间前后传递一个字符串和一个数组。

感谢您的帮助

答案 4 :(得分:0)

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

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