iOS转场及传值

作为初学者, 有错误的地方还请大神们挑出, 本人接受批评, 多谢各位大神了

iOS转场: (RootViewController, SecondViewController)

<#(nonnull UIViewController *)#>: 目标viewController

animated: 是否存在动画

//Show: 选择Show,目的地视图会被压入导航栈顶部. 导航条会提供一个后退按钮,用以返回源视图. 这是最常用的方式.
//Show detail:与Show相似, 但会替换源视图. 将没有导航条和后退按钮.
[self.navigationController pushViewController:delita animated:YES];
[self.navigationController showViewController:delita sender:<#(nullable id)#>

completion: 转场之后做什么, 是一个block函数

//Present Modally: 模态显示内容.目的地视图会从底向上弹出, 通常用于显示跟页面连贯性不强的视图, 比如 添加餐馆, 添加用户(无论在哪个页面,都可能会调用此功能)
self.navigationController presentViewController:<#(nonnull UIViewController *)#> animated:<#(BOOL)#> completion:<#^(void)completion#>

Present as popover:iPad中常用,模态显示一个带箭头指向圆角矩形弹窗. 类似一个弹出菜单.

转场传值:

1. 属性传值

//转场方法
- (void)btnAction:(UIButton *)btn{
    SecondViewController *sec = [[SecondViewController alloc] init];//获取目标场景
    sec.string = self.label.text;//string为目标场景中的属性(NSString)
    [self.navigationController pushViewController:sec animated:YES];//转场
}

2. 代理传值(反向转场)

1. 设置代理

@protocol SecondViewControllerDelegate <NSObject>
@optional
- (void)changeTitle:(NSString *)title;
@end

2. 在SecondViewController.h定义代理

@property (nonatomic, assign) id<SecondViewControllerDelegate>delegate;

3. 在SecondViewController.m使用代理传值

- (void)backAction:(UIButton *)btn{
    if (self.delegate && [self.delegate respondsToSelector:@selector(changeTitle:)]) {//判断是必须的
        [self.delegate changeTitle:self.textField.text];
    }
    [self.navigationController popToRootViewControllerAnimated:YES];
}

4. 在RootViewController.m中遵循代理并且实现代理方法

记得让SecondViewController指定代理人为RootViewController.m

- (void)changeTitle:(NSString *)title{
    self.navigationItem.title = title;
}

3. block 传值

block定义

/**
     *    //定义一个参无返回值的block函数
     *    void 无返回值
     *
     *    @param ^ block名称
     *
     *    @^() 无参数
     */
    void (^voidFunc)() = ^(){
        NSLog(@"我是一个代码块");
    };
    //使用block
    voidFunc();
/**
     *    定义一个实现输出两个整数之和的block函数
     *    void 无返回值
     *    @param (int , int )类型说明
     *    @param a 参数
     *    @param b 参数
     */
    void (^addBlock)(int , int ) = ^(int a, int b){
        NSLog(@"a + b = %d", a + b);
    };
    addBlock(4, 6);
/**
     *    block命别称
     *
     *    @param void (^)(int , int) 函数类型
     *    @param Block 别名
     */
    typedef void (^Block)(int ,int );
    //给一个参数为两个整数, 返回值为整形的block类型命别称
    typedef int (^addTwo)(int ,int );
    //block使用
    addTwo subBlock = ^(int a, int b){
        return a-b;
    };
    //block中没有使用局部变量, block存储在全局区,
    //block中如果有使用全局变量, 则存储在栈区
    subBlock(10, 5);

block传值步骤

1. 在SecondViewController.h给block命别称(一般不省略)
typedef void(^titleBlock)(NSString *title);
2. 在SecondViewController.h中定义一个block属性
@property (nonatomic, copy) titleBlock myBlock;
//注意: block属性必须用copy
//block使用全局变量, 存在栈区, 使用copy是把block复制一份到堆区
3. 在跳转页面方法中给block属性赋值(RootViewController的btnAction:)
    //在block中使用局部变量
    //__block(MRC)/__weak(ARC)
    __weak RootViewController *temp = self;//复制指针(引用计数不变)
    //不使用temp而用self, 在下个界面会持有self, 引用计数会+1
    //使用self容易造成循环引用(MRC下)
    sec.myBlock = ^(NSString *title){
        temp.navigationItem.title = title;
    };
4. 调用block属性传入参数
- (void)backAction:(UIButton *)btn{
    self.myBlock(self.textField.text);
    [self.navigationController popToRootViewControllerAnimated:YES];
}

单例模式传值

1. 新建一个单例模式, 这里新建一个类白包含单例模式(User)

//在User.h中定义一些属性, 这些属性作为存取值的对象
@property (nonatomic, strong) NSString *userName;
@property (nonatomic, strong) NSString *passworld;
//设计一个单例模式初始化
//获取唯一的用户
+ (User *)defaultUser;

2. 实例化初始化

+ (User *)defaultUser{
    //static修饰的对象只会在第一次调用函数时初始化, 之后不再初始化
    static User *user = nil;
   if(user == nil){//判断user是否为空, 空则初始化
       user =[ [User alloc] init];
   }
   return user;
}

2. 在RootViewController.m中导入User.h, 同时在viewWillAppear(界面即将显示)中获取单例模式的值

- (void)viewWillAppear:(BOOL)animated{
    self.textField.text = [User defaultString].string;
}

3. 在转场按钮函数中将值存入User中

- (void)btnAction:(UIButton *)btn{
    SecondViewController *sec = [[SecondViewController alloc] init];
    //获取单例
    User *u = [User defaultString];
    //赋值
    u.string = self.textField.text;
    [self.navigationController pushViewController:sec animated:YES];
}
注: 如果需要让RootViewController一开始就显示, 比如让textField一开始就显示"单例模式"
//在viewDidLoad中直接初始化User并存值
self.textField.text = @"单例模式";
[User defaultString].string = self.textField.text;

4. 在SecondViewController中使用User中的string给self.textField.text赋值

self.textField = [[UITextField alloc] initWithFrame:CGRectMake(50, 200, 200, 50)];
    self.textField.borderStyle = UITextBorderStyleRoundedRect;
    self.textField.text = [User defaultString].string;
    self.textField.delegate = self;
    self.textField.textAlignment = NSTextAlignmentCenter;
    self.textField.clearButtonMode = UITextFieldViewModeAlways;
    [self.view addSubview:self.textField];

5. 在按钮返回函数中存储数据

- (void)btnAction:(UIButton *)btn{
    User *u = [User defaultString];
    u.string = self.textField.text;
    [self.navigationController popViewControllerAnimated:YES];//返回上层界面
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容