无法将值传递回 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