多个uiviewController之间传值

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

 


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

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



1.添加协议

PassValueDelegate.h

#import 

@protocol PassValueDelegate 
- (void)passValue:(NSString*)value;
@end

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

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* passValueDelegate;

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];

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


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













你可能感兴趣的:(IOS)