进一步阅读之前,可以先思考这个问题: 存在数组
@[@(90), @(31), @(65), @(78), @(76)]
,如何取出数组中的最大值或者最小值?
KVC 的集合操作符可使用键路径和操作运算作用于集合中的所有元素。本文将描述一些可用的集合操作。
KVC 的集合操作符实际上就是一些特殊的键路径,以参数的形式传递给 valueForKeyPath:
方法。集合操作是以 @*
开始的字符串, 也可理解为: KVC集合操作符允许在
valueForKeyPath:
方法中使用 key path
符号在一个集合中执行方法。无论什么时候你在 key path
中看见了@*,它都代表了一个特定的集合方法,其结果可以被返回或者链接,就像其他的
key path 一样。下图就是集合操作符的格式:
其中左边的键路径(keypathToCollection)指定了相对消息接收者的 NSArray 或者 NSSet,右边的键路径(keypathToProperty)指定了相对于集合内对象的键路径,集合操作作用于该键路径。
Continue readingKVO, 即键值观察,提供了一种让一个对象监听另一个对象的特定属性变化的机制。这在 MVC 的 Model 层 和 Controller 层间通信十分有用。通常情况下,Controller 会监听 Model 对象的属性变化,或者 View 对象会通过 Controller 来监听 Model 对象的属性变化。除此之外,在 Model 对象需要感知其依赖值的改变的时候,该 Model 对象也可以监听其他 Model 对象或者其自身的属性变化。
监听属性变化需要以下几步:
- 使用函数
addObserver:forKeyPath:options:context:
建立观察者和被观察者对象之间的连接,这种连接不是建立在这两个类之间,而是两个对象实例之间。 - 为了响应被观察者对象的变化通知,观察者必须实现
observeValueForKeyPath:ofObject:change:context:
方法,该方法定义了观察者是如何对被观察者的变化做出响应的。 - 当被观察的属性发生变化时,
observeValueForKeyPath:ofObject:change:context:
方法会自动调用。 - 调用
– removeObserver:forKeyPath:context:
取消注册。
在项目,可能会有需求需要监听 NSMutableArray 的变化,例如在可变数组中加入、删除或者替换了元素,我们需要根据这些变化来更新UI或者做其他操作。
那么如何来监听呢?
方法1,使用 mutableArrayValueForKey:
代理,这样,我们在获取定义的数组属性时不再使用其 getter
方法,而是通过代理方法获取数组属性后,再对数组进行增删改的操作。这是最简单高效的方法,使用示例如下:
tranquilpeak是Hexo的主题,目前版本是1.3.0,其自带google统计,为了适应国情的发展,可以替换为百度统计。
Continue reading使用 Storyboard 时,通常情况下,可能你不会去关心 NSLayoutConstraint 的 priority 属性,使用 Storyboard 提供的默认值就能达到要求。但是最近遇到对 UILabel 的如下布局要求时,就需要涉及对 priority 的修改。
如上所示,我们期望 UILabel 显示字符串较短时,以内容的多少来决定其宽度;当其显示的字符串较长时,截断其尾部,且 UILabel 的 Trailing 距离 UIButton 的 Leading 大于等于30,UIButton的宽度由其title内容决定。在 Storyboard 将 UILabel 和 UIButton 设置好约束,不改变约束的 priority 的前提下,在 Xcode6.4 的环境下会出现约束错误提示。你可先考虑为什么会出现约束错误以及如何解决这种错误。
Continue readingiOS 中可获取当前网络接口的 SSID
和 BSSID
信息,如下:
1 | NSString *ssid = @""; |
Apple 设备可在用户不感知的情况下进行wifi的切换,如果我们在App
内部需要感知设备wifi切换的变化,可以在 Darwin Notify Center
中注册监听 kNotifySCNetworkChange
通知,如下:
现在iOS新建项目工程时,window 默认情况下是以
Main.storyboard
中 initial view controller,
在项目中,如果需要通过代码控制 window 的 rootViewController ,
可以通过如下方法:
1 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { |
+ initialize
和 + load
是
NSObject
类的两个类方法,它们会在运行时自动调用,我们可以利用其特性做一些初始化操作。
可以先思考如下示例控制台应该输出什么:
1 | //父类 |
启动并运行程序,控制台应输出什么呢,见结尾处。
Continue reading