[iOS]视图间传值/传参的若干方式

  • 单例模式
  • 属性
  • 代理
  • 通知

单例模式

某个类只产生一个对象,且是一个全局对象,以后每次创建该类对象时,只会得到第一次创建的那个类对象。

所以,可以用于在多视图场景下传递参数,原理如下图所示。

在创建单例类的时候,需要注意:

  1. 首先必须创建一个全局实例,通常存放在一个全局变量中,此全局变量设置为nil
  2. 需要重写+allocWithZone:方法,防止通过标准的alloc方式创建新的实例
  3. 需要重写-copyWithZone方法,防止通过copy方法得到新的实例
  4. 需要重写-mutableCopyWithZone:方法,防止通过copy方法得到新的实例

示例如下:

Singleton.h

@interface Singleton : NSObject <NSCopying, NSMutableCopying>
@property (strong, nonatomic)NSString *value;    //该属性可以被不同视图使用,传值依据

//单例方法
+ (id)shareSingleton;

@end

其中,继承NSCopying和NSMutableCopying协议是为了重写copyWithZone和mutableCopyWithZone方法

Singleton.m

static Singleton *instance = nil;   //存在于整个程序生命周期

#pragma mark 单例方法
+ (id)shareSingleton{
    if (nil == instance) {
        instance = [[Singleton alloc]init];
    }
    
    return instance;
}

//重写allocWithZone:方法,防止通过标准的alloc方式创建新的实例
+(instancetype)allocWithZone:(struct _NSZone *)zone{
    if (nil == instance) {
        instance = [[super allocWithZone:zone]init];
    }
    
    return instance;
}

//重写copyWithZone:方法,防止通过copy方法得到新的实例
-(id)copyWithZone:(NSZone *)zone{
    return self;
}

//重写mutableCopyWithZone:方法,防止通过copy方法得到新的实例
-(id)mutableCopyWithZone:(NSZone *)zone{
    return self;
}

在A视图中赋值

    //获取导航栏的大小
    CGRect rectNav = nav.navigationBar.frame;
    //单例模式保存导航栏的高度
    Singleton *singe = [Singleton shareSingleton];
    singe.value = [NSString stringWithFormat:@"%f", rectNav.size.height];

在B视图中使用

    Singleton *single = [Singleton shareSingleton];
    CGRect frame = CGRectMake(0, 5+single.value.floatValue, self.frame.size.width, 200);
时间: 2024-10-24 12:19:24

[iOS]视图间传值/传参的若干方式的相关文章

iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)

iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式:2.通知notification方式:3.block方式:4.UserDefault或者文件方式:5.单例模式方式:6.通过设置属性,实现页面间传值 在iOS开发中,我们经常会遇到页面间跳转传值的问题,现归纳总结一下: 情况1:A页面跳转到B页面 方法: 在B页面的控制器中,编写对应的属性,在A页面跳转到B页面的地方,给

iOS页面间传值的方式

实现了以下iOS页面间传值:1.委托delegate方式:2.通知notification方式:3.block方式:4.UserDefault或者文件方式:5.单例模式方式:6.通过设置属性,实现页面间传值 在iOS开发中,我们经常会遇到页面间跳转传值的问题,现归纳总结一下: 情况1:A页面跳转到B页面 方法: 在B页面的控制器中,编写对应的属性,在A页面跳转到B页面的地方,给B的属性赋值即可 //SecondViewController.h @property(nonatomic) NSInt

iOS页面间传值的五种方式总结(Delegate/NSNotification/Block/NSUserDefault/单例)

iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值:1.委托delegate方式:2.通知notification方式:3.block方式:4.UserDefault或者文件方式:5.单例模式方式:6.通过设置属性,实现页面间传值 在iOS开发中,我们经常会遇到页面间跳转传值的问题,

iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例)

实现了以下iOS页面间传值:1.委托delegate方式:2.通知notification方式:3.block方式:4.UserDefault或者文件方式:5.单例模式方式:6.通过设置属性,实现页面间传值 在iOS开发中,我们经常会遇到页面间跳转传值的问题,现归纳总结一下: 情况1:A页面跳转到B页面 方法: 在B页面的控制器中,编写对应的属性,在A页面跳转到B页面的地方,给B的属性赋值即可 //SecondViewController.h @property(nonatomic) NSInt

iOS页面间传值的方式 (Delegate/NSNotification/Block/NSUserDefault/单例)

iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例) 实现了以下iOS页面间传值: 1.委托delegate方式:2.通知notification方式:3.block方式:4.UserDefault或者文件方式:5.单例模式方式:6.通过设置属性. 在iOS开发中,我们经常会遇到页面间跳转传值的问题,现归纳总结一

iOS 页面间传值 之 单例传值 , block 传值

ios 页面间传值有许多,前边已经分享过属性传值和代理传值,今天主要说一下单例传值和 block 传值 单例传值:单例模式一种常用的开发的模式,单例因为在整个程序中无论在何时初始化对象,获取到的都是同一个对象,对象的属性相同,所以可以用来传值. block 传值 与 代理传值相似,主要用于第二个页面向第一个页面传值,block 传值具体步骤: 在第二个页面: 1.声明: block typedef void(^SendMessagerBlock) (NSString *str); 2.创建方法:

ASP.NET页面间传值的几种常见方式

(新建项目WebApplication,添加新项:源页面Default.aspx和目标页面WebForm1.aspx. 在源页面Default.aspx中添加两个TextBox, ID分别为Nametb和Emailtb,两个Label;在WebForm1.aspx中添加两个Label,ID分别为lname和lemail,用于显示TextBox传过来的值.) 1.使用QueryString 使用QueryString在页面间传递值已经是一种很老的机制了,这种方法的主要优点是实现起来非常简单,然而它

android/IOS常用图片上传的两种方式

android/IOS常用图片上传的两种方式: 1.上传到服务器的文件服务器(FileServer) 原理:上传到文件服务器的方式是先在服务器端搭建文件服务器,配置好路径(url),该路径是我们待会上传图片的路径,配置成功后便通过http+post的模式上传到文件服务器,同时文件服务器将返回一个图片ID,这个ID就是图片的唯一标识,并将该ID写入数据库保存,当需要下载该图片时只需要将此ID带上即可. 两个核心问题: (1)服务端:配置FileServer,并写处理响应上传图片的代码,这个值得去网

Shell传参的多种方式

Shell 传参的多种方式 使用$1 $2 这种类似占位符的方式 # 命令行调用 start.sh 8080 9090 # 脚本中获取 port1=$1 # 8080 port2=$2 # 9090 可以看出来这种方式使用起来很简单,但灵活性太差,比如我只想传第二个参数,第一个使用默认值,这个就不行,所以就有第二种,指定参数传递 指定参数 getopts(shell内置命令) #命令行调用 start.sh -a 8080 -b 9090 # 脚本中获取 while getopts "d:b:h