将一些数据传回 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的主要内容,如果未能解决你的问题,请参考以下文章
向下滑动以关闭另一个视图控制器时,有没有办法将数据传回视图控制器?
iOS - UIViewController 的属性 navigationController 为零,即使它设置为 UINavigationController 的 rootViewControlle