将一些数据传递回RootViewController iOS 7

时间:2014-03-19 09:30:18

标签: ios objective-c uiviewcontroller uinavigationcontroller delegates

假设我们在UINavigationController中有3个ViewControllers,名为ViewControllerA,ViewControllerB,ViewControllerC。具体来说,ViewControllerA是RootViewController,并且ViewControllerB和ViewControllerC被推送到它上面。因此,目前ViewControllerC位于Top并且对用户可见。

我想通过调用[self.navigationController popToRootViewControllerAnimated:YES];方法返回ViewControllerA,并从此处将一些数据传递给ViewControllerA。我必须根据从ViewControllerC传递的数据更新一些UI。

如果我必须从ViewControllerB返回数据,那么我可以实现自定义协议/委托。但在上述情况下,什么是一个好方法?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

您可以尝试NSNotificationCenter,如下所示。

示例:

在ViewControllerA.m中

-(void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataReceived:) name:@"passData" object:nil];
}

-(void)dataReceived:(NSNotification *)noti
{
    NSLog(@"dataReceived :%@", noti.object);
}

在ViewControllerC.m中

-(void)gotoHome
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"passData" object:[NSDictionary dictionaryWithObject:@"Sample Data" forKey:@"dataDic"]];

    [self.navigationController popToRootViewControllerAnimated:YES];
}

答案 1 :(得分:1)

您可以使用委托方法

这是调用委托方法的根ViewController

#import "ThirdViewController.h"
#import "SecondViewController.h"
 @interface ViewController ()<ThirdViewControllerDelegate>
  @end

@implementation ViewController
 #pragma mark -
 #pragma mark ThirdViewController Delegate Method

在Root ViewController中实现委托方法

-(void)didSelectValue:(NSString *)value{
    NSLog(@"%@",value);
}

将最后一个Vc委托传递给下一个ViewController

-(void)gotoSeconddVc{
    SecondViewController *vc2=[[SecondViewController alloc]init];
    vc2.lastDelegate=self;
    [self.navigationController pushViewController:vc2 animated:YES];
}


 #import "ThirdViewController.h"
     @interface SecondViewController : UIViewController
        @property(nonatomic,retain) id <ThirdViewControllerDelegate> lastDelegate;
        @end

-(void)gotoThirdVc{
    ThirdViewController *vc3=[[ThirdViewController alloc]init];
    vc3.delegate=self.lastDelegate;
    [self.navigationController pushViewController:vc3 animated:YES];
}

最后一个viewcontroller的实现

@implementation ThirdViewController


-(void)btnDoneClicked{
    [self.navigationController popToRootViewControllerAnimated:YES];
    [self.delegate didSelectValue:strValue]; //call delegate methods here
}

答案 2 :(得分:0)

最好的方法是在不同的类中分离共享信息(我建议,它将是一些模型类)。只需在两个视图控制器中存储相同的模型类实例,并在模型类更改时更新它们。每个viewDidAppear:方法使用通知,KVC或询问模型状态。