zoukankan      html  css  js  c++  java
  • iOS 页面传值方式 单例,block,代理协议方法,通知中心

    实现了以下iOS页面间传值:1.委托delegate方式;2.通知notification方式;3.block方式;4.UserDefault或者文件方式;5.单例模式方式;6.通过设置属性,实现页面间传值

    情况一 属性传值

    属性传值用于正向传值,比如从a界面跳转到b页面。在a界面导入b页面的头文件,给创建的b类的b对象的属性赋值,代码如下

    在要跳转的b界面,添加个属性

    	@interface ShuxingViewController : UIViewController
    	//@property (weak, nonatomic) IBOutlet UILabel *Shuxinglabel;
    	@property (weak, nonatomic) IBOutlet UILabel *Slabel;
    	@property(strong,nonatomic)NSString *String;
    

    在a界面

       ShuxingViewController *Shuxing=[[UIStoryboard storyboardWithName:@"Main" bundle:nil]instantiateViewControllerWithIdentifier:@"ShuxingViewController"];
    Shuxing.String=self.ShuxingTextField.text;
    [self.navigationController pushViewController:Shuxing animated:YES];
    

    情况二 delegate协议方法

    这个可以应用于反向传值,就是a页面,跳转到b页面,b在有值要传回a页面。

    首先在b界面要声明一个带参数的协议方法-(void)show:(NSString *)strig;

     #import <UIKit/UIKit.h>
    @protocol DelegateViewControllerDelegate 
    @optional
    -(void)show:(NSString *)strig;
    @end
    @interface DelegateViewController : UIViewController
    @property (weak, nonatomic) IBOutlet UITextField *DelegateTextfield;
    @property (nonatomic, weak) id <DelegateViewControllerDelegate> delegate;
    - (IBAction)DeBack:(id)sender;
    @end
    

    在b的.m文件里,当点击返回按钮以后,要调用这个协议方法,并传入这个要传的参数 self.DelegateTextfield.tex

    - (IBAction)DeBack:(id)sender {
    [self.delegate show:self.DelegateTextfield.text];
     }
    

    在b里面声明了这个方法-(void)show:(NSString *)strig; 然后并且调用了,那在哪里实现这个方法呢?对了,在a界面实现它

    在a界面,导入这个b界面的头文件,

    #import "DelegateViewController.h"
    #import "ViewController.h"
    #import "ShuxingViewController.h"
    @interface ViewController ()<DelegateViewControllerDelegate>
    
    @end
    

    注意,这一定要写的

    @interface ViewControlle()<DelegateViewControllerDelegate>
    

    然后在a的.m文件里面实现-(void)show:(NSString *)strig 这个方法

       -(void)show:(NSString *)strig{
        NSLog(@"%@",strig);
        self.ViewDeLabel.text=strig;
        }
    

    如果只完成了上面的步奏,还是不能传值的。还要在a的.m文件里点击进入b页面的方法里,让创建的b对象,遵守delegate

     - (IBAction)DelegatecLick:(id)sender {
    DelegateViewController *ssssss=[[UIStoryboard storyboardWithName:@"Main" bundle:nil]instantiateViewControllerWithIdentifier:@"DelegateViewController"];
    ssssss.delegate=self;
    [self.navigationController pushViewController:ssssss animated:YES];
    }
    

    情况三 block 传值

    关于block 有两篇介绍 block介绍:http://blog.csdn.net/totogo2010/article/details/7839061 一篇描述block回调挺有意思的文章: http://blog.csdn.net/mobanchengshuang/article/details/11751671

    下面说下怎么用block传值

    首先在b页面的.h中 定义一个block,传一个NSString的参数

     typedef void (^ablock)(NSString
                       *str);
    

    并且声明一个ablock的属性

         @property (nonatomic,copy) ablock block;
    

    在b的.m 当点击把参数传给上个页面的方法里,实现这个block

     - (IBAction)BlockBack:(id)sender {
    self.block(self.BlcokTextfield.text);
     }
    

    在b的控制器里面实现了这个block以后,要回到a的.m里面去回调这个block

     - (IBAction)BlcokcLick:(id)sender {
    BlockViewController *ssssss=[[UIStoryboard storyboardWithName:@"Main" bundle:nil]instantiateViewControllerWithIdentifier:@"BlockViewController"];
    
    ssssss.block=^(NSString *str){
        //当这个block 在b页面里面实现了以后,这个代码块里面的内容就会被执行
        self.BlcokLabel.text=str;
    };
    [self.navigationController pushViewController:ssssss animated:YES];
    }
    

    单例模式

    首先要先创建一个单例的类

    .h

       #import <Foundation/Foundation.h>
    
    	@interface LittleSinge : NSObject
    	@property(nonatomic,strong)NSString *kk;
    	+(LittleSinge
    	  *)sharedLittleSinge;
    	@end 
    

    .m

    #import "LittleSinge.h"
    
    @implementation LittleSinge
    //下面这样写 是保证SingleCommone 这个类只会被创建一次
    +(LittleSinge
      *)sharedLittleSinge{
        static LittleSinge *singleCommone = nil;
        static dispatch_once_t once;
        dispatch_once(&once,
                      ^{  singleCommone
                          = [LittleSinge new];
                      });
        return singleCommone;
        }
    @end
    

    创建好单例文件以后呢,在要传值的页面,导入单例的头文件 对,就像这样

      #import "LittleSinge.h"
      #import "SingeleViewController.h"
    

    在b的.m传值返回上个页面的方法里,给

     - (IBAction)SingleBack:(id)sender {
    [LittleSinge sharedLittleSinge].kk=self.SingleText.text;
    }
    

    在a的.m的viewWillAppear方法里

    -(void)viewWillAppear:(BOOL)animated{
    self.SingleLabel.text=[LittleSinge sharedLittleSinge].kk;
    }
  • 相关阅读:
    编程路上有你们陪着值了
    我是屌丝程序猿,我为自己代言.
    JSON转换类
    深入理解requestAnimationFrame
    CentOS部署yapi
    前端三种路由方式
    yarn安装使用
    三大框架对比
    es6异步编程
    JS原型链
  • 原文地址:https://www.cnblogs.com/sunkaifeng/p/5272815.html
Copyright © 2011-2022 走看看