前言:生命不止,折腾不休.窗口间传参数,一般用什么代理模式,(到现在还没有搞懂代理,所以不鸟这个.),难道不能向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
使用全局变量,任意文件引入import "AppDelegate.h",然后就可以愉快的使用了.
AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];
myDelegate.myName =@"bababa";
下篇写什么呢?准备写cordova 调用 原生的ios窗口.
后记:
明明swift大行其道,为毛要objc,知道为毛吗?百度的sdk mb的用的objc写的例子,cordova核心代码都是objc,我也想用swift,但是学了也看不懂cordova的核心代码,看不懂百度地图的例子. sob!