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

  • 单例模式

  • 属性

  • 代理

  • 通知


单例模式

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

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

205236_3vbr_2392723.png


与C++不一样,使用ObjectiveC创建单例类的时候,需要注意:

  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);


转载于:https://my.oschina.net/u/2392723/blog/476791

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值