主菜单使用NavigationController 在push进去的viewController中选中选项后 将数据传回最外层ViewController
若点击的省市为直辖市的时候,直接传值给RootViewController, 如果点击的省市为非直辖市,则进入城市选项,再次点击城市的时候将值传回RootViewController
则需要在第二层与第三层中都都实现将值传回RootViewController
1.添加协议
PassValueDelegate.h
#import
@protocol PassValueDelegate
- (void)passValue:(NSString*)value;
@end
RootViewController.h
#import
#import "GDataXMLNode.h"
#import "PassValueDelegate.h"
@interface RootViewController : UIViewController
{
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
@propert (nonatomic,assign)NSObject
ProvinceController.h
#import
#import "GDataXMLNode.h"
#import "PassValueDelegate.h"
@interface ProvinceViewController : UIViewController
{
GDataXMLDocument* doc;
NSMutableArray* provinceArray;
NSMutableArray* cityArray;
UITableView* myTableView;
}
@property (nonatomic,assign) NSObject *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*)[self.navigationController.viewControllers objectAtIndex:0];
[self.navigationController pushViewController:cityVC animated:YES];
[cityVC release];
到次,可以在第二层和第三层中给第一层赋值。