CSS 规则由两部分组成,选择器和声明。选择器是用于告知浏览器,要对 HTML 的哪个元素设置样式。声明由 key-value
键值对组成,用于描述样式。
CSS 声明总是以 ;
结束,声明组以 {}
括起来:
|
|
Quick notes
CSS 规则由两部分组成,选择器和声明。选择器是用于告知浏览器,要对 HTML 的哪个元素设置样式。声明由 key-value
键值对组成,用于描述样式。
CSS 声明总是以 ;
结束,声明组以 {}
括起来:
|
|
<form>
的常用属性有以下几种:
属性 | 值 | 描述 |
---|---|---|
aciton | URL | 服务器的 URL |
method | GET、POST | HTTP 方法 |
name | form_name | 表单的名称 |
target | blank、self、parent、top | 在何处打开 action URL |
enctype | 以下 | 表单数据的编码方式 |
|
|
表单常见的元素有以下几种:
标签 | 描述 |
---|---|
<input> |
表单输入标签 |
<select> |
菜单和列表标签 |
<option> |
菜单和列表项目标签 |
<textarea> |
文字域标签 |
<optgroup> |
菜单和列表项目分组标签 |
HTML 表格主要由以下标签组成:
标签 | 描述 |
---|---|
<table> |
定义表格 |
<th> |
定义表格的表头 |
<tr> |
定义表格的行 |
<td> |
定义表格单元 |
<caption> |
定义表格标题 |
<colgroup> |
定义表格列的组 |
<col> |
定义用于表格列的属性 |
代码演示如下:
|
|
<div>
和 <span>
可以将 HTML 元素组合起来,大多数 HTML 元素被定义为块级元素或内联元素。块级元素在浏览器显示时,通常会以新行来开始和结束,例如以下标签:
|
|
内联元素在显示时通常不会以新行开始,例如:
|
|
HTML 主要由三大部分组成:
<head>
标签;<body>
标签;<html>
标签;
|
|
HTML 是由一个个元素组成,元素就是一个一个的标签,例如:
|
|
以上这些都是 HTML 元素。
响应者对象就是可以响应事件并对事件作出处理。在 iOS 中,存在 UIResponder
类,它定义了响应者对象的所有方法。UIApplication
、UIView
等类都继承了 UIResponder
类,UIWindow
和 UIKit
中的控件因为继承了 UIView
,所以也间接继承了 UIResponder
类,这些类的实例都可以当作响应者。
当前接受触摸的响应者对象被称为第一响应者,即表示当前该对象正在与用户交互,它是响应者链的开端。
响应者链表示一系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者。
一般来说,第一响应者是个视图对象或者其子类对象,当其被触摸后事件被交由它处理,如果它不处理,事件就会被传递给它的视图控制器对象(如果存在),然后是它的父视图对象(如果存在),以此类推,直到顶层视图。
接下来会沿着顶层视图(top view
)到窗口(UIWindow
)再到程序(UIApplication
)。如果整个过程都没有响应这个事件,该事件就被丢弃。
一般情况下,在响应者链中只要由对象处理事件,事件就停止传递。但有时候可以在视图的响应方法中根据一些条件判断来决定是否需要继续传递事件。
Runtime 是 iOS 开发中的知名黑魔法,充分体现了 Objective - C 的动态运行时特性,Swift 是一门静态语言,这意味着代码编译时即确定了其实际调用的方法和类型,所以纯粹的 Swift 类和对象没有办法使用 Runtime,更不存在 Method swizzling,但是呢,Swift 是兼容 Objective - C 的,继承自 NSObject 的类,也就具有了运行时的消息机制。
纯粹的 Swift 类,也可以通过添加 @objc
修饰符, @objc
关键字只需要对那些不是继承自 NSObject
的类型进行,如果 class 是继承自 NSObject
的话,Swift 会默认自动为所有的非 private 的类和成员加上 @objc
。
@objc
修饰符主要用于需要暴露给 Objective-C 使用的任何地方 (包括类,属性和方法等) ,以支持其动态派发和运行时机制。
添加 @objc
修饰符并不意味着这个方法或者属性会变成动态派发,Swift 依然可能会将其优化为静态调用。如果需要施展一些像 Method swizzling 或者运行时再决定实现这样的 “黑魔法” 的时候,我们就必须用到 dynamic
修饰符了。 dynamic
修饰符会隐式的添加 @objc
进行修饰。
也就是说,需要 Swift 和 Objective 混合开发时,使用 @objc
就可以了,需要 Swift 完全实现运行时机制时,那么必须要添加 dynamic
修饰符。
下面我们通过优化归解档,来了解 Runtime 在 Swift 中的应用:
前两天面试在KVC的问题上有所欠缺,对于底层了解不够,因此写下这篇文章。这篇文章主要是使用KVC对Key的搜索原理,自己写代码来实现KVC。
关于Apple是如何实现KVC这个问题:
🙃 🙃 我也不知道……
因为没有办法打印出调用过的函数,所以KVC背后的一切还是很神秘的,只能通过几个有限的API来猜想,
对于setValue:forKey:
,在setter存在的情况,KVC 会直接发送set<Key>:
消息赋值;
在setter不在的情况下,且accessInstanceVariablesDirectly
方法是true的情况下,会按(_<key>, _<isKey>, <key>, is<Key>)
的顺序去查找实例变量,检查其是否存在之后通过object_setIvar
给它赋值。
如果都没有就调用setValue:forUNdefinedKey:
抛出错误。
对于setValue:forKeyPath:
,递归地检查keyPath中的属性是否存在,到达目标路径时再调用setValue:forKey:
完成赋值。
大致上我准备按上面的执行顺序进行实现,由于集合、字典和模型、KeyPath的情况比较复杂,所以我只实现了最普通的存值和取值,下面进入正题:
前两天遇到一个 Plist 和转义符的问题,这个问题我翻了 Google 十几页,但是并没有找到解决的方法,也没有找到关于这个问题的描述,因此我想先记录下来,如果有人和我遇到同样的问题,可以知道结果是怎样的。
当然,由于我的才疏学浅,我没能解决不一定大家都不能解决,如果你有解决的思路,欢迎邮件我啊!
如果不想看过程,可以直接翻到最下面看验证的结果。
问题是这样的,我创建了一个 Plist 文件,希望用来存储用户的设置选项,遇到的第一个坑是 KVC 不支持 Bool 类型,这个是我没想起了,使用 0 和 1 来替代解决了,现在要讲的是第二个坑。
因为我在项目中使用了字体图标,它类似 Emoji 表情:使用 Unicode 编码,获取特定的图标。在其他的页面中,我使用了全局变量 + UILabel 转 UIImage 的方式,获取并使用字体图标,代码如下:
iOS 中的观察者 Observer 模式包含了通知机制(Notification)和KVO(Key-Value-Observing)机制,我们知道对象之间的通讯有以下几种常见的方式:
Delegate、Block、KVO、Notification;
其中 Delegate 使用的是委托机制,是一对一的对象之间的通信;而 KVO 和 Notification 通知机制是广播,也就是一对多的对象之间的通信。那么对象之间的通讯又是做什么呢?简单来说就是在 A 类中创建的方法,在 B 类中执行,且 A 类可以传递数据给 B 类,我们知道当说起通知时,有以下几种:
本地通知、推送通知、广播通知;
这三种通知是不同的,本地通知使用的是 UILocalNotification
实现,是我们的 APP 运行时,给用户的通知;推送通知是使用 UIUserNotification
实现,是用户同意推送后,由我们的服务器提交给 APNS,再由 APNS 转发给用户的。
而我们本文要探讨的是,程序中的对象与对象之间的通知,也就是最后一项,广播通知。