Skip to content

Commit 723e5fd

Browse files
committed
nodes api improvements
1 parent 2db35ee commit 723e5fd

File tree

4 files changed

+66
-21
lines changed

4 files changed

+66
-21
lines changed

Demos/Demos/TableViewController.swift

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,18 @@ extension TableViewController: UITableViewDelegate, UITableViewDataSource {
8686
}
8787
}
8888

89+
class MyView: UIView {
90+
91+
var color: UIColor? {
92+
set {
93+
backgroundColor = newValue
94+
}
95+
get {
96+
return backgroundColor
97+
}
98+
}
99+
}
100+
89101
class SampleCell: UITableViewCell {
90102

91103
override func layoutSubviews() {
@@ -111,6 +123,14 @@ class SampleCell: UITableViewCell {
111123
let rootNode: RootNode
112124
}
113125

126+
override func prepareForReuse() {
127+
super.prepareForReuse()
128+
129+
if let v = contentView.findViewWithTag(Tags.Highlight1) as? MyView {
130+
v.color = UIColor.redColor().colorWithAlphaComponent(0.2)
131+
}
132+
}
133+
114134
var model: SampleModel?
115135
var cache: Cache?
116136

@@ -131,9 +151,9 @@ class SampleCell: UITableViewCell {
131151
return v
132152
}
133153

134-
let h1Node = Node(tag: Tags.Highlight1) {
135-
let v = $0 ?? UIView()
136-
v.backgroundColor = UIColor.redColor().colorWithAlphaComponent(0.2)
154+
let h1Node = Node<MyView>(tag: Tags.Highlight1) {
155+
let v = $0 ?? MyView()
156+
137157
return v
138158
}
139159

LayoutOps/LayoutOps/ImageNode.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55

66
import UIKit
77

8-
public class ImageNode: Node {
8+
public class ImageNode: AnyNode {
99

1010
private let image: UIImage
11-
public init<T: UIImageView>(tag: Taggable, image: UIImage, subnodes: [Node] = [], initializer: (T?)->T) {
11+
public init<T: UIImageView>(tag: Taggable, image: UIImage, subnodes: [AnyNode] = [], initializer: (T?)->T) {
1212
self.image = image
1313
super.init(tag: tag, subnodes: subnodes) { (imageView: T?) -> T in
1414
let imgView = initializer(imageView)

LayoutOps/LayoutOps/LabelNode.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ public enum LabelNodeString {
1010
case Attributed(NSAttributedString)
1111
}
1212

13-
public class LabelNode: Node {
13+
public class LabelNode: AnyNode {
1414

1515
private let text: LabelNodeString
16-
public init<T: UILabel>(tag: Taggable, text: LabelNodeString, subnodes: [Node] = [], initializer: (T?)->T) {
16+
public init<T: UILabel>(tag: Taggable, text: LabelNodeString, subnodes: [AnyNode] = [], initializer: (T?)->T) {
1717
self.text = text
1818
super.init(tag: tag, subnodes: subnodes) { (label: T?) -> T in
1919

@@ -25,7 +25,6 @@ public class LabelNode: Node {
2525
l.font = font
2626
l.text = string
2727
}
28-
initializer(l)
2928
return l
3029
}
3130
}

LayoutOps/LayoutOps/Node.swift

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,27 @@ extension UIView {
4141
return objc_getAssociatedObject(self, &key) as? String
4242
}
4343
}
44+
45+
private func _findViewWithTag(tag: Taggable) -> UIView? {
46+
if tag.tag == stringTag {
47+
return self
48+
}
49+
50+
for v in subviews {
51+
if let v = v.findViewWithTag(tag) {
52+
return v
53+
}
54+
}
55+
56+
return nil
57+
}
58+
59+
public func findViewWithTag<T: UIView>(tag: Taggable) -> T? {
60+
return _findViewWithTag(tag).flatMap { $0 as? T }
61+
}
4462
}
4563

46-
public class Node: Layoutable {
64+
public class AnyNode: Layoutable {
4765

4866
public var bounds: CGRect {
4967
return CGRect(x: 0, y: 0, width: frame.width, height: frame.height)
@@ -55,8 +73,8 @@ public class Node: Layoutable {
5573
return size
5674
}
5775

58-
private var subnodes: [Node]
59-
private var supernode: Node?
76+
private var subnodes: [AnyNode]
77+
private var supernode: AnyNode?
6078

6179
public weak var parent: Layoutable? {
6280
return supernode
@@ -71,7 +89,7 @@ public class Node: Layoutable {
7189

7290
private let tag: Tag
7391

74-
public init<T: UIView>(tag: Taggable, subnodes: [Node] = [], initializer: (T?)->T) {
92+
public init<T: UIView>(tag: Taggable, subnodes: [AnyNode] = [], initializer: (T?)->T) {
7593

7694
self.tag = .Tagged(tag)
7795
self.initializer = {
@@ -84,7 +102,7 @@ public class Node: Layoutable {
84102
}
85103
}
86104

87-
private init(rs: CGSize, subnodes: [Node]) {
105+
private init(rs: CGSize, subnodes: [AnyNode]) {
88106

89107
self.tag = .Root
90108

@@ -98,7 +116,7 @@ public class Node: Layoutable {
98116
}
99117
}
100118

101-
private func installInView(rootView: UIView) {
119+
public func installInRootView(rootView: UIView) {
102120

103121
switch tag {
104122
case .Root:
@@ -117,30 +135,38 @@ public class Node: Layoutable {
117135

118136
view.frame = frame
119137
subnodes.forEach {
120-
$0.installInView(view)
138+
$0.installInRootView(view)
121139
}
122-
123140
}
124141
}
125142
}
126143

127-
public class RootNode: Node {
128-
//root node
129-
public init(size: CGSize, subnodes: [Node]) {
144+
public class RootNode: AnyNode {
145+
146+
public init(size: CGSize, subnodes: [AnyNode]) {
130147
super.init(rs: size, subnodes: subnodes)
131148
}
132149

133150
public override func sizeThatFits(size: CGSize) -> CGSize {
134151
fatalError("RootNode is not intended to respond sizeThatFits")
135152
}
136153

137-
public func installInRootView(rootView: UIView) {
154+
public override func installInRootView(rootView: UIView) {
138155
subnodes.forEach {
139-
$0.installInView(rootView)
156+
$0.installInRootView(rootView)
140157
}
141158
}
142159
}
143160

161+
public class Node<T: UIView>: AnyNode {
162+
163+
public override init(tag: Taggable, subnodes: [AnyNode] = [], initializer: (T?)->T) {
164+
super.init(tag: tag, subnodes: subnodes) { (view: T?) -> T in
165+
return initializer(view)
166+
}
167+
}
168+
169+
}
144170

145171

146172

0 commit comments

Comments
 (0)