无法将值传递回parentViewController

时间:2012-02-20 10:57:24

标签: objective-c ios uinavigationcontroller pop

我有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];
}

5 个答案:

答案 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中查看我对此类似问题的回答。