多个uiviewController之间传值

来源:互联网 发布:产品网络营销策划方案 编辑:程序博客网 时间:2024/05/20 17:59

主菜单使用NavigationController  在push进去的viewController中选中选项后  将数据传回最外层ViewController

 


若点击的省市为直辖市的时候,直接传值给RootViewController, 如果点击的省市为非直辖市,则进入城市选项,再次点击城市的时候将值传回RootViewController

则需要在第二层与第三层中都都实现将值传回RootViewController



1.添加协议

PassValueDelegate.h

#import <Foundation/Foundation.h>@protocol PassValueDelegate <NSObject>- (void)passValue:(NSString*)value;@end

第一层  RootViewController  需要调用的为第一层中的函数  则该层为协议的遵守者  ,在.h文件中遵守协议,在.m文件中实现协议中的方法

RootViewController.h

#import <UIKit/UIKit.h>#import "GDataXMLNode.h"#import "PassValueDelegate.h"@interface RootViewController : UIViewController <PassValueDelegate>{    NSString* _cityName;    NSString* urlPath;    int weatherDay;    GDataXMLDocument* doc;}@property (nonatomic,strong) NSString* cityName;@end

RootViewController.m   传进来的为一个String类型的  用于测试,将该值打印出来

//实现passValueDelegate中的方法- (void)passValue:(NSString *)value{    NSLog(@"value = %@",value);}

并且在点击 右上角 切换城市的时候 调用 changeCity方法  设置第二层中代理

- (void)changeCity{    ProvinceViewController* provinceVC = [[ProvinceViewController alloc] init];        //添加代理    provinceVC.passValueDelegate = self;        [self.navigationController pushViewController:provinceVC animated:YES];        [provinceVC release];}




第二层为ProvinceViewController, 它为协议中方法的调用者  

则需要在.h文件中添加

#import "PassValueDelegate.h"

并且声明 NSObject<PassValueDelegate>*类型的 成员变量

@propert (nonatomic,assign)NSObject<PassValueDelegate>* passValueDelegate;

ProvinceController.h

#import <UIKit/UIKit.h>#import "GDataXMLNode.h"#import "PassValueDelegate.h"@interface ProvinceViewController : UIViewController <UITableViewDelegate,UITableViewDataSource>{    GDataXMLDocument* doc;    NSMutableArray* provinceArray;    NSMutableArray* cityArray;    UITableView* myTableView;}@property (nonatomic,assign) NSObject<PassValueDelegate> *passValueDelegate;@end
在ProvinceController.m中  即可调用该协议的方法

[self.passValueDelegate passValue:@"this is a test string!"];


第三层中类似第二层中实现的方法   ,与第二层中不同的是   因为是在第二层中实例化 的第三层的对象  ,对视最终协议的拥有者为RootViewController

则遇到的问题是需要在第二层中设置第三层的代理为 RootViewController 即第一层的对象。

如以下代码 

 CityViewController* cityVC = [[CityViewController alloc] initWithNibName:nil bundle:nil withCityArray:cityArray];        cityVC.passValueDelegate = (NSObject<PassValueDelegate>*)[self.navigationController.viewControllers objectAtIndex:0];                [self.navigationController pushViewController:cityVC  animated:YES];        [cityVC release];

可以用  self.navigationController.viewControllers 这个方法取出此时UInavigation 栈中所有的对象   然后通过索引0取出对象 并赋值给 第三层的代理 


到次,可以在第二层和第三层中给第一层赋值。













原创粉丝点击