将一些数据传回 RootViewController iOS 7

Posted

技术标签:

【中文标题】将一些数据传回 RootViewController iOS 7【英文标题】:Passing some data back to RootViewController iOS 7 【发布时间】:2014-03-19 09:30:18 【问题描述】:

假设,我们的UINavigationController 中有 3 个 ViewController,分别称为 ViewControllerA、ViewControllerB、ViewControllerC。具体来说,ViewControllerA 是RootViewController,ViewControllerB 和 ViewControllerC 被推送到它上面。因此,当前 ViewControllerC 位于顶部并且对用户可见。

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

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

提前感谢您的帮助。

【问题讨论】:

使用单例类从lastView控制器共享信息到first。 您也将使用 NSNotificationCenter 将数据发送到任何正在运行的视图控制器。 在这种情况下使用 localNotification 来共享信息 使用委托将数据从一个视图控制器移动到另一个控制器 【参考方案1】:

您可以尝试如下所示的 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];

【讨论】:

【参考方案2】:

这里你可以使用委托方法

这是你调用委托方法的根 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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于将一些数据传回 RootViewController iOS 7的主要内容,如果未能解决你的问题,请参考以下文章

使用委托将数据传回导航堆栈

Swift 将计算的数据传回之前的视图控制器

将 mmap 的区域传回内核空间

向下滑动以关闭另一个视图控制器时,有没有办法将数据传回视图控制器?

iOS - UIViewController 的属性 navigationController 为零,即使它设置为 UINavigationController 的 rootViewControlle

反转Segue时如何将信息传回iOS?