Skip to content

Commit 5ea5eef

Browse files
Table view example uses observed object
1 parent 48eb7c5 commit 5ea5eef

File tree

1 file changed

+48
-43
lines changed

1 file changed

+48
-43
lines changed

BBSwiftUIKitDemo/BBSwiftUIKitDemo/TableViewExample.swift

Lines changed: 48 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -10,89 +10,94 @@ import SwiftUI
1010
import BBSwiftUIKit
1111

1212
struct TableViewExample: View {
13-
@State var list = 0..<100
14-
@State var updateHeight = false
15-
@State var reloadData = false
16-
@State var reloadRows: [Int] = []
17-
@State var scrollToRow: Int? = nil
18-
@State var contentOffset: CGPoint = .zero
19-
@State var contentOffsetToScrollAnimated: CGPoint? = nil
20-
@State var isRefreshing: Bool = false
21-
@State var isLoadingMore: Bool = false
13+
14+
class Model: ObservableObject {
15+
@Published var list = 0..<100
16+
@Published var updateHeight = false
17+
@Published var reloadData = false
18+
@Published var reloadRows: [Int] = []
19+
@Published var scrollToRow: Int? = nil
20+
@Published var contentOffset: CGPoint = .zero
21+
@Published var contentOffsetToScrollAnimated: CGPoint? = nil
22+
@Published var isRefreshing: Bool = false
23+
@Published var isLoadingMore: Bool = false
24+
25+
func reloadListData() {
26+
self.list = 0..<100
27+
self.updateHeight.toggle()
28+
self.reloadData = true
29+
}
30+
31+
func reloadListRows() {
32+
list = 0..<100
33+
updateHeight.toggle()
34+
reloadRows = (0..<10).map { $0 }
35+
}
36+
}
37+
38+
@ObservedObject var model = Model()
2239

2340
var body: some View {
2441
VStack {
25-
BBTableView(list) { i in
42+
BBTableView(model.list) { i in
2643
if i % 2 == 0 {
27-
Text("\(i)")
28-
.frame(height: self.updateHeight ? 50 : 100)
44+
Text("\(i)\(self.model.updateHeight ? "" : "A")")
45+
.frame(height: self.model.updateHeight ? 50 : 100)
2946
.padding()
3047
.background(Color.blue)
3148
} else {
3249
Image(systemName: "heart")
3350
.resizable()
3451
.scaledToFit()
35-
.frame(height: self.updateHeight ? 20 : 40)
52+
.frame(height: self.model.updateHeight ? 20 : 40)
3653
.padding()
3754
.background(Color.orange)
3855
}
3956
}
40-
.bb_reloadData($reloadData)
41-
.bb_reloadRows($reloadRows, animation: .automatic)
42-
.bb_scrollToRow($scrollToRow, position: .none, animated: true)
43-
.bb_contentOffset($contentOffset)
44-
.bb_contentOffsetToScrollAnimated($contentOffsetToScrollAnimated)
57+
.bb_reloadData($model.reloadData)
58+
.bb_reloadRows($model.reloadRows, animation: .automatic)
59+
.bb_scrollToRow($model.scrollToRow, position: .none, animated: true)
60+
.bb_contentOffset($model.contentOffset)
61+
.bb_contentOffsetToScrollAnimated($model.contentOffsetToScrollAnimated)
4562
.bb_setupRefreshControl { refreshControl in
4663
refreshControl.tintColor = .blue
4764
refreshControl.attributedTitle = NSAttributedString(string: "Loading...", attributes: [.font: UIFont.systemFont(ofSize: 15), .foregroundColor: UIColor.blue])
4865
}
49-
.bb_pullDownToRefresh(isRefreshing: $isRefreshing) {
66+
.bb_pullDownToRefresh(isRefreshing: $model.isRefreshing) {
5067
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
51-
self.reloadListData()
52-
self.isRefreshing = false
68+
self.model.reloadListData()
69+
self.model.isRefreshing = false
5370
}
5471
}
5572
.bb_pullUpToLoadMore(bottomSpace: 30) {
56-
if self.isLoadingMore { return }
57-
self.isLoadingMore = true
73+
if self.model.isLoadingMore { return }
74+
self.model.isLoadingMore = true
5875
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
59-
self.list = 0..<self.list.last! + 11
60-
self.isLoadingMore = false
76+
self.model.list = 0..<self.model.list.last! + 11
77+
self.model.isLoadingMore = false
6178
}
6279
}
6380

64-
Slider(value: $contentOffset.y, in: 0...1000)
81+
Slider(value: $model.contentOffset.y, in: 0...1000)
6582

6683
Button("Scroll to y = 1000") {
67-
self.contentOffsetToScrollAnimated = CGPoint(x: 0, y: 1000)
84+
self.model.contentOffsetToScrollAnimated = CGPoint(x: 0, y: 1000)
6885
}
6986
.padding()
7087

7188
Button("Reload data") {
72-
self.reloadListData()
73-
self.scrollToRow = 0
89+
self.model.reloadListData()
90+
self.model.scrollToRow = 0
7491
}
7592
.padding()
7693

7794
Button("Reload rows") {
78-
self.reloadListRows()
79-
self.scrollToRow = 0
95+
self.model.reloadListRows()
96+
self.model.scrollToRow = 0
8097
}
8198
.padding()
8299
}
83100
}
84-
85-
private func reloadListData() {
86-
self.list = 0..<100
87-
self.updateHeight.toggle()
88-
self.reloadData = true
89-
}
90-
91-
private func reloadListRows() {
92-
self.list = 0..<100
93-
self.updateHeight.toggle()
94-
self.reloadRows = (0..<10).map { $0 }
95-
}
96101
}
97102

98103
struct TableViewExample_Previews: PreviewProvider {

0 commit comments

Comments
 (0)