我有masterViewController和detailViewController。 Masterview推送detailView。回到masteViewController时,我想更新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];
}
答案 0 :(得分:7)
[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
答案 1 :(得分:0)
为了使setValue:ForKey:工作,您的视图控制器必须符合NSKeyValueCoding协议。
试试这个:
-(void)goBack{
[self.navigationController.parentViewController setFoo:@"bar"];
[self.navigationController popViewControllerAnimated:YES];
}
并且不要忘记在setFoo:
方法中适当地保留/释放。您可能还需要键入强制转换parentViewController以避免任何警告。
答案 2 :(得分:0)
将带有assign属性的master的引用传递给详细视图。 使用此引用在执行弹出操作之前设置foo值。
答案 3 :(得分:0)
g如果你想将一个对象传递给父对象,你可以尝试在头文件中创建一个外部对象,并在你想要使用它的控制器中导入头,但这不是最佳实践,但它是一个快速解决方案 导入
extern MyObject* Object;
@interface GlobalVariables : NSObject {
}
@end
现在你要做的就是在控制器中包含标题并使用全局变量。
如果你想通过书籍来做,我建议你创建一个处理对象传递的委托。
答案 4 :(得分:0)
通常,在这种情况下,您需要使用委托。在此SO中查看我对此类似问题的回答。