LionEvents
LionEvents 是一个模仿 Adobe Flash ActionScript 3.0 事件机制的框架。
它的大优点是不需要 Selector,也没有前缀为 @obj 的私有函数。
使用 LionEvents,您可以实现更高效的封装,并减少耦合程度。
LionEvents 提供了一个比 NSNotification 更有效的事件机制。该特性非常适合开发自定义交互式 UI 与您的代码结构集成。
使用 Xcode 7.0.1 创建于 Swift 2.0。由 Lion 信息科技有限公司开发。
特性
- 更容易在类之间传递事件。
- 不需要设置函数名的 Selector 字符串。
- 减少耦合程度。
- 使您的代码更优雅。
- 比 NSNotification 更有效(未成熟测试)。
- 删除注册到事件的具体事件处理器或将与事件相关联的所有事件处理器。
- 在多线程环境中运行良好(未测试)。
- 将事件处理器注册到对象或将与一个事件相关联的事件处理器注册到对象。
安装
iOS 7项目:
drag <LionEvents> folder to your project.
pod
pod 'LionEvents', '0.10.0'
Swift 4项目:
drag <LionEvents> folder to your project.
pod
pod 'LionEvents', '0.10.1'
使用
功能:松耦合LionEvents事件机制,让您专注于编程,避免由于“选择器未找到”而崩溃的问题。您可以随意添加/移除自定义事件或事件处理器。
LionEvents的主要类是EventDispatcher。只需继承EventDispatcher即可实现整个事件机制。
另一种方式是通过扩展NSObject与EventDispatcher,我们已经对UIButton和一些常见的UIKit组件(例如UIButton、UISwitch)做了这样的事情。
1:添加事件监听器
对于常见的UIKit组件(例如LNButton, LNView),我们可以通过以下方式注册事件
let _button:LNButton = LNButton(frame: CGRectMake(0, 0, 50, 30))
_button.addEventListener(LNButtonEvents.TOUCH_UP_INSIDE, onButtonHandler) _button.addEventListener(LNButtonEvents.TOUCH_UP_OUTSIDE, onButtonHandler)
_button.addEventListener(LNButtonEvents.TOUCH_DOWN, onButtonHandler)
通过设置,触摸事件:LNButtonEvents.TOUCH_UP_INSIDE / TOUCH_UP_OUTSIDE / TOUCH_DOWN将触发onButtonHandler事件处理器。
2:回调或处理器
事件处理器可以不带参数或传入一个事件参数。LNEvent具有一些有用的属性。
像这样
private func onButtonHandler(){
println("LNButton has Event!")
}
或
private func onButtonHandler(e:Event){
switch e.type {
case LNButtonEvents.TOUCH_DOWN.rawValue:
println("\(e.type)")
case LNButtonEvents.TOUCH_UP_INSIDE.rawValue:
println("\(e.type)")
case LNButtonEvents.TOUCH_UP_OUTSIDE.rawValue:
println("\(e.type)")
default:
break
}
let _dispatcher:EventDispatcher = e.target as! EventDispatcher
let _btn:UIButton = e.currentTarget as! UIButton
// remove Listener by EventType
_btn.removeEventListener(LNButtonEvents.TOUCH_DOWN)
_btn.removeEventListener(LNButtonEvents.TOUCH_UP_INSIDE)
_btn.removeEventListener(LNButtonEvents.TOUCH_UP_OUTSIDE)
// or
_btn.removeAllEventListener()
}
我们也可以使用闭包:`(Wow!)`
mModel.addEventListener(Model.ADD, { (aEvent:Event) -> Void in
println("\(aEvent.type),\(aEvent.target)")
})
3:自定义事件
如果您想要自定义自己的事件,只需继承EventDispatcher或NSObject。
继承EventDispatcher
import Foundation
import LionEvents
class Model:EventDispatcher {
static let ADD:String = "model_add"
static let DEC:String = "model_dec"
private var mIndex:Int = 0
var index:Int{
set(value){
if value > mIndex {
mIndex = value
let _event:Event = Event(aType: Model.ADD, aBubbles: false)
dispatchEvent(_event)
}else if value < mIndex {
mIndex = value
let _event:Event = Event(aType: Model.ADD, aBubbles: false)
dispatchEvent(_event)
}
}
get{
return mIndex
}
}
}
mModel.addEventListener(Model.ADD, onModelChangeHandler)
mModel.addEventListener(Model.DEC, onModelChangeHandler)
继承NSObject
import UIKit
import LionEvents
class ModelObject: NSObject {
static let ADD:String = "model_add"
static let DEC:String = "model_dec"
private var mIndex:Int = 0
var index:Int{
set(value){
if value > mIndex {
mIndex = value
let _event:Event = Event(aType: Model.ADD, aBubbles: false)
dispatchEvent(_event)
}else if value < mIndex {
mIndex = value
let _event:Event = Event(aType: Model.ADD, aBubbles: false)
dispatchEvent(_event)
}
}
get{
return mIndex
}
}
}
我们建议继承EventDispatcher,它执行效率更高。
4:移除事件监听器
LionEvents和ActionScript 3.0在移除事件监听器方面存在一些不同的点。
Swift没有函数指针,所以在移除特定事件监听器时,可以这样做
从实例中移除一个特定事件名称的事件监听器
var mFirstButtonListener:EventListener?
let mButton:UIButton = UIButton(frame: CGRectMake(0, 0, 50, 30))
private func createMutilsEvents(){
// if want to remove target listener handler
mFirstButtonListener = mButton.addEventListener(LNButtonEvents.TOUCH_UP_INSIDE, onButtonFirstHandler)
mButton.addEventListener(LNButtonEvents.TOUCH_UP_INSIDE, onButtonAlwaysHandler)
}
private func onButtonFirstHandler(){
mButton.removeEventListener(LNButtonEvents.TOUCH_UP_INSIDE, aListener: mFirstButtonListener!)
}
或者移除一个特定事件的所有事件监听器
从实例中移除相同名称的事件监听器
_btn.removeEventListener(LNButtonEvents.TOUCH_DOWN)
_btn.removeEventListener(LNButtonEvents.TOUCH_UP_INSIDE)
_btn.removeEventListener(LNButtonEvents.TOUCH_UP_OUTSIDE)
或者移除所有事件的所有事件监听器
从实例中移除所有事件监听器
_btn.removeEventListener(nil)
在使用常见的UIKit组件时,还有一个移除函数可供选择
_btn.removeAllEventListener()
5:公告
LionEvents实现了ActionScript 3.0事件机制的绝大部分,并且也具有对同一事件进行多次事件注册的特性。
例如
let _model:Model = Model()
_model.addEventListener(Model.ADD, onModelChangeHandler)
_model.addEventListener(Model.ADD, onModelChangeHandler)
_model.addEventListener(Model.ADD, onModelChangeHandler)
_model.index++
private func onModelChangeHandler(aEvent:Event){
println("model change!")
}
结果
model change!
model change!
model change!
事件Model.ADD仅被触发了一次,但事件处理器被触发三次。
6:待办事项列表和错误
- 未测试相同实例重复移除和添加EventListener的情况。
- 未实现ActionScript事件冒泡机制。(真是太遗憾了!)
- Swift没有函数指针,所以在尝试移除EventListener时,我们必须获取特定的EventListener实例。
- 大致测试了执行效率。
授权许可
LionEvents基于BSD许可发布。有关详细信息,请参阅LICENSE文件。
由Lion信息科技有限公司开发。