Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用委托将数据传递回导航堆栈_Objective C_Ios_Delegates_Uinavigationcontroller - Fatal编程技术网

Objective c 使用委托将数据传递回导航堆栈

Objective c 使用委托将数据传递回导航堆栈,objective-c,ios,delegates,uinavigationcontroller,Objective C,Ios,Delegates,Uinavigationcontroller,我在两个视图控制器之间传输数据已经有几天了,现在我感到非常困惑。我刚接触Objective-C,发现有些地方很难让我清醒过来 我有一个导航控制器,FirstView是一个表单,在这个表单上我有一个按钮,可以加载包含TableView的SecondView,供用户选择一些选项。然后我想把选择传回FirstView控制器,并显示数据等 我已经读了很多关于这方面的书(stackoverflow,iphonedevsdk,CS 193P参考资料),我看到的选项是 1) ivar应用程序内代理(脏且不推荐

我在两个视图控制器之间传输数据已经有几天了,现在我感到非常困惑。我刚接触Objective-C,发现有些地方很难让我清醒过来

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

我已经读了很多关于这方面的书(stackoverflow,iphonedevsdk,CS 193P参考资料),我看到的选项是

1) ivar应用程序内代理(脏且不推荐) 2) 创建一个单例 3) 创建一个数据模型类 4) 使用协议和代理(由apple推荐)

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

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

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

提前谢谢
马特从我头上掉下来。您可以使用自定义对象替换
\u 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

在本例中,委派是正确的模式,但是您的描述看起来不像委派,因为它使用的是全局变量。也许您正在应用程序委托中存储全局变量,您应该始终避免这些变量

下面是代码的大致轮廓:

第二视图控制器.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
@implementation SecondViewController

@synthesize delegate;
@synthesize someArray;

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

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

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

@end
FirstViewController.h:

#import SecondViewController

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

@end

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

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

感谢Elimantas,尝试实现此功能,但失败了!这是真正的协议和委托实现吗?我没有看到@protocol和。你有xcode中的代码吗?还是你直接把它写进了应答器?不是xcode写的。它直接进入应答器。为了让这段代码正常工作,您不需要协议(除非您想要没有gcc警告的干净代码)。你说的“失败”是什么意思?这个方法没有被调用吗?我将使用自定义setter更新代码。我得到以下结果:错误:此行@property returnedProperty=\u returnedProperty的“returnedProperty”之前应包含说明符限定符列表;对不起,艾曼塔斯,也许是我太简单了,但我无法让代码正常工作。非常感谢你的帮助。非常感谢你的回复,给别人很好的参考。我还问了另一个类似的问题,然后给出了完整的答案。你能告诉我如何从第一个视图到第二个视图做同样的事情吗,比如从第一个视图到第二个视图发送字符串,特别是设置委托给自己。。?提前感谢:)为什么在创建id委托和属性委托时出现“现有实例变量”错误。?谢谢