我有以下设置,GridView
包括GridViewCell
s.
GridView
class GridView : UIView {
var gridViewCells: [GridViewCell] = []
let tapHandler: Position -> ()
init(frame: CGRect, tapHandler: Position -> ()) {
self.tapHandler = tapHandler
super.init(frame: frame)
self.gridViewCells = createCells(self)
addCellsToView(self.gridViewCells)
}
func addCellsToView(cells: [GridViewCell]) {
for cell in cells {
self.addSubview(cell)
}
}
}
网格视图单元格
class GridViewCell: UIImageView {
let position: Position
let tapHandler: Position -> ()
init(frame: CGRect, position: Position, tapHandler: Position -> ()) {
self.position = position
self.tapHandler = tapHandler
super.init(frame: frame)
}
func handleTap(sender: UITapGestureRecognizer) {
self.tapHandler(self.position)
}
}
请注意,我省略了代码中一些不太相关的部分,只需知道在创建单元格时createCells()
,每个细胞得到一个UITapGestureRecognizer
其目标是handleTap:
,我也在使用:
typealias Position = (Int, Int)
所以,正如你所看到的,每当GridView
被实例化,它被传递一个回调函数tapHandler: Position -> ()
当用户点击单元格时,最终会被单元格调用。
现在,我想将 Tap 事件变成 RACSignal
。我不知道如何解决这个问题,因为我对 RAC 很陌生。谢谢Colin Eberhardts 博客文章 http://blog.scottlogic.com/2015/04/24/first-look-reactive-cocoa-3.html,我设法对构建块有了基本的了解,并实现了一个自定义信号,如下所示:
func createSignal() -> Signal<String, NoError> {
var count = 0
return Signal {
sink in
NSTimer.schedule(repeatInterval: 1.0) { timer in
sink.sendNext("tick #\(count++)")
}
return nil
}
}
我现在基本上想要类似的行为,只是发出的事件不是由NSTimer
,而是通过handleTap()
功能。