无法将值传递回 parentViewController

Posted

技术标签:

【中文标题】无法将值传递回 parentViewController【英文标题】:Unable to pass value back to parentViewController 【发布时间】:2012-02-20 10:57:23 【问题描述】:

我有 masterViewController 和 detailViewController。 Masterview 推送 detailView。返回 masterViewController 时,我想更新 foo 值。但我只从 nslog 得到 NULL。导航时如何将 parenteViewContrller.foo 值设置为 @"bar"?

masterViewController.h

    NSString *foo; 
    -(void)setFoo:(NSString *)fooValue
    @property(nonatomic, retain) NSString *foo; 

masterViewController.m

@synthesize foo;

-(void)setFoo:(NSString *)fooValue

    NSLog(@"updated foo:%@", fooValue);

detailViewController.m

-(void)goBack
    [self.navigationController.parentViewController setValue:@"bar" forKey:@"foo"];
    [self.navigationController popViewControllerAnimated:YES];

【问题讨论】:

【参考方案1】:

[UIViewController parentViewController] 不会返回您从 ios 5 开始的期望,而是您应该使用 [UIViewController presentingViewController]

如果您只是针对 iOS 5,开始使用 presentingViewController 很容易,但如果不是,我建议您手动传递您的 UIViewController

// DetailViewController.h

@class MasterViewController;

@interface DetailViewController : UIViewController

@property (assign, nonatomic) MasterViewController *masterViewController;

@end


// DetailViewController.m

#import "DetailViewController.h"
#import "MasterViewController.h"

@implementation DetailViewController

- (void)goBack 

    [self.masterViewController setFoo:@"bar"];

    // dismiss this view controller


@end


// MasterViewController.h

@interface MasterViewController : UIViewController

- (void)setFoo:(NSString *)bar;

@end


// MasterViewController.m

#import "MasterViewController.h"
#import "DetailViewController.h"

@implementation MasterViewController

- (void)goForward 

    DetailViewController *detailViewController = ...;
    [detailViewController setMasterViewController:self];

    // present this view controller


@end

【讨论】:

您是否建议将 UIVIewController 保存在 AppDelegate 中以获得全局解决方案? @Odelya 我总是建议您避免使用应用程序范围的变量阻塞您的应用程序委托。最好使用单例实例或某种形式的管理器类。【参考方案2】:

为了让 setValue:ForKey: 工作,你的视图控制器必须符合NSKeyValueCoding 协议。

试试这个:

-(void)goBack
    [self.navigationController.parentViewController setFoo:@"bar"];
    [self.navigationController popViewControllerAnimated:YES];

并且不要忘记在您的setFoo: 方法中适当地保留/释放。您可能还需要键入 cast parentViewController 以避免任何警告。

【讨论】:

这在 iOS 5 中不起作用,[UIViewController parentViewController] 在 iOS 5 中有不同的含义,所以如果是这种情况,您应该使用 [UIViewController presentingViewController]【参考方案3】:

将具有分配属性的主引用传递给详细视图。 使用此引用在执行弹出操作之前设置 foo 值。

【讨论】:

【参考方案4】:

g如果你想将一个对象传递给父对象,你可以尝试在头文件中创建一个外部对象,然后在你想使用它的控制器中导入头文件,但这不是最佳做法,但它是一个快速修复 导入

extern MyObject* Object;
@interface GlobalVariables : NSObject 



@end

您现在要做的就是在控制器中包含标头并使用全局变量。

如果你想按书本做,我建议你创建一个处理对象传递的委托。

【讨论】:

【参考方案5】:

通常,在这种情况下,您需要使用委托。在SO 中查看我对这个类似问题的回答。

【讨论】:

以上是关于无法将值传递回 parentViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从子窗体传递回父窗体?

响应者链但不是委托属性将值从容器传递回视图控制器

将值传递回控制器时的 ASP.NET MVC 日期时间文化问题

自动将事件从 ChildViewController 传递到 parentViewController

如何将触摸事件传递给 parentViewController?

DocuSign不会将值传递给Salesforce