老粗ios学习笔记(2)-ui开发 窗口间传递参数

前言:生命不止,折腾不休.窗口间传参数,一般用什么代理模式,(到现在还没有搞懂代理,所以不鸟这个.),难道不能向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


4.父窗口m文件,实现这个函数

@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!





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值