前言:生命不止,折腾不休.窗口间传参数,一般用什么代理模式,(到现在还没有搞懂代理,所以不鸟这个.),难道不能向windows,安卓一样,几行代码就完成参数传递,非要写一堆的代理文件,粗人心想,实现不了,就把老乔给挖出来狠批一顿,还好一下成功了,节约了不少口水.
1.子窗口头文件中,定义2个窗口级的变量:para存放父窗口传过来变量,pvc保存父窗口指针. 和两个函数:设置参数与设置父窗口.(说人话:就是定义了参数和保存父窗口的set方法)
@interface LoginViewController : UIViewController{ UIButton *mybut; //变量1:保存父窗口传递的函数 NSString * para; //变量2:保存父窗口ViewController指针 UIViewController *pvc; //函数1:保存父窗口View指针 (返回值) 函数名:(参数1类型)参数1名称 -(void)SetParentView:(UIViewController *)viewController; //设置初始化参数 //函数2:让父窗口向子窗口设置参数 (返回值) 函数名:(参数1类型)参数1名称 -(void)setPara:(NSString *)pwin_para; }
2.子窗口m文件中实现这两个方法.
@implementation LoginViewController NSLog(@"父窗口参数:%@",pWinPara); //调用父窗口函数 [(ViewController *)pvc finishWindow:@"子窗口调用父窗口函数:老子就灿烂!!"]; //关闭窗口 [self dismissViewControllerAnimated:YES completion:nil]; } //设置初始化参数 -(void)setPara:(NSString *)pwin_para{ //题外话,之前把参数命名为para始终告警说Local declaration of 'para' hides instance variable //查明原因为与本地函数同名,局部变量与本地函数同名都要闹,闹个屁. pWinPara = pwin_para; } //保存父窗口viewController // (返回值) 函数名:(参数1类型)参数1名称 -(void)SetParentView:(ViewController *)viewController{ pvc = viewController; } @end
3.父窗口头文件,增加一个函数,让子窗口可以在关闭的时候调用.
@interface ViewController : UIViewController{} //子窗口关闭时调用 -(void)finishWindow:(NSString *)resParam; @end
@implementation ViewController - (IBAction)mianButClick:(id)sender { NSLog(@"点击了按钮"); LoginViewController *loginController = [[LoginViewController alloc] initWithNibName:@"myView2" bundle:nil]; //初始化子窗口参数 [loginController setPara:@"父窗口给你点阳光"]; //将父窗口的传给子窗口备用. [loginController SetParentView:self]; //看不懂,反正用了这个才能调用子窗口 UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:loginController]; //window的模式窗口都是弹出后不在执行后面的代码,连js alert都是,ios奇葩,弹出窗口代码之后继续执行后面的代码,连窗口什么时候关闭都不知道.碧池! [self presentViewController:navigationController animated:YES completion:^(void){ // 可以在这儿加上窗口打开成功后执行的代码 }]; //如果这儿有代码,模式窗口创建时就都执行了. } //只能在关闭窗口前调用这个函数,这样才知道窗口被关闭了. -(void)finishWindow:(NSString *)resParam{ //在这写关闭子窗口的要做的事情. NSLog(@"%@",resParam); } @end
5.总结,执行逻辑
创建子窗口,将参数传给子窗口,把自己也传给子窗口,子窗口欢快的执行他的代码,关闭的时候,调用父窗口函数通知窗口关闭.
6.附加:
另外还可以通过全局变量进行参数传递.
在AppDelegate.h定义一个属性 myName
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate>{} //定义一个属性,里面大概是这些意思, <span style="font-family: Arial, Helvetica, sans-serif;">nonatomic:禁止多线程,retain:增加set和get方法 strong 申明的变量将变为持有者(写的啥jb,看不懂).</span> @property (nonatomic, retain) NSString *myName; @property (strong, nonatomic) UIWindow *window; @end
在AppDelegate.m中,synthesize合成一下这个变量.
#import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate //不知道什么意思,查了一下资料说h里面用@<span style="font-family: Arial, Helvetica, sans-serif;">property,m文件用这个就实现了类似set方法了.</span> @synthesize myName; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {return YES;} - (void)applicationWillResignActive:(UIApplication *)application {} - (void)applicationDidEnterBackground:(UIApplication *)application {} - (void)applicationWillEnterForeground:(UIApplication *)application {} - (void)applicationDidBecomeActive:(UIApplication *)application {} - (void)applicationWillTerminate:(UIApplication *)application {} @end
AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];
myDelegate.myName =@"bababa";
下篇写什么呢?准备写cordova 调用 原生的ios窗口.
后记:
明明swift大行其道,为毛要objc,知道为毛吗?百度的sdk mb的用的objc写的例子,cordova核心代码都是objc,我也想用swift,但是学了也看不懂cordova的核心代码,看不懂百度地图的例子. sob!