Skip to content

Commit 1f541a1

Browse files
BBTableView adds scrollToRow
1 parent 59176ae commit 1f541a1

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

BBSwiftUIKit/BBSwiftUIKit/BBTableView.swift

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ public extension BBTableView {
2121
return view
2222
}
2323

24+
func bb_scrollToRow(_ scrollToRow: Binding<BBTableViewScrollToRowParameter?>) -> Self {
25+
var view = self
26+
view._scrollToRow = scrollToRow
27+
return view
28+
}
29+
2430
func bb_contentOffset(_ contentOffset: Binding<CGPoint>) -> Self {
2531
var view = self
2632
view._contentOffset = contentOffset
@@ -34,12 +40,25 @@ public extension BBTableView {
3440
}
3541
}
3642

43+
public struct BBTableViewScrollToRowParameter {
44+
public let row: Int
45+
public let position: UITableView.ScrollPosition
46+
public let animated: Bool
47+
48+
public init(row: Int, position: UITableView.ScrollPosition, animated: Bool) {
49+
self.row = row
50+
self.position = position
51+
self.animated = animated
52+
}
53+
}
54+
3755
public struct BBTableView<Data, Content>: UIViewControllerRepresentable, BBUIScrollViewRepresentable where Data : RandomAccessCollection, Content : View, Data.Element : Equatable {
3856
let data: Data
3957
let content: (Data.Element) -> Content
4058

4159
@Binding public var reloadData: Bool
4260
@Binding public var reloadRows: [Int]
61+
@Binding public var scrollToRow: BBTableViewScrollToRowParameter?
4362
@Binding public var contentOffset: CGPoint
4463
@Binding public var contentOffsetToScrollAnimated: CGPoint?
4564
public var isPagingEnabled: Bool
@@ -52,6 +71,7 @@ public struct BBTableView<Data, Content>: UIViewControllerRepresentable, BBUIScr
5271
public init(_ data: Data,
5372
reloadData: Binding<Bool> = .constant(false),
5473
reloadRows: Binding<[Int]> = .constant([]),
74+
scrollToRow: Binding<BBTableViewScrollToRowParameter?> = .constant(nil),
5575
contentOffset: Binding<CGPoint> = .constant(.bb_invalidContentOffset),
5676
contentOffsetToScrollAnimated: Binding<CGPoint?> = .constant(nil),
5777
isPagingEnabled: Bool = false,
@@ -66,6 +86,7 @@ public struct BBTableView<Data, Content>: UIViewControllerRepresentable, BBUIScr
6686
self.content = content
6787
self._reloadData = reloadData
6888
self._reloadRows = reloadRows
89+
self._scrollToRow = scrollToRow
6990
self._contentOffset = contentOffset
7091
self._contentOffsetToScrollAnimated = contentOffsetToScrollAnimated
7192
self.isPagingEnabled = isPagingEnabled
@@ -160,8 +181,12 @@ private class _BBTableViewController<Data, Content>: UIViewController, UITableVi
160181
}
161182
}
162183

163-
// TODO: Scroll to row
164-
if let contentOffset = representable.contentOffsetToScrollAnimated {
184+
if let scrollToRow = representable.scrollToRow {
185+
tableView.scrollToRow(at: IndexPath(row: scrollToRow.row, section: 0), at: scrollToRow.position, animated: scrollToRow.animated)
186+
DispatchQueue.main.async {
187+
self.representable.scrollToRow = nil
188+
}
189+
} else if let contentOffset = representable.contentOffsetToScrollAnimated {
165190
tableView.setContentOffset(contentOffset, animated: true)
166191
DispatchQueue.main.async {
167192
self.representable.contentOffsetToScrollAnimated = nil

BBSwiftUIKitDemo/BBSwiftUIKitDemo/TableViewExample.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ struct TableViewExample: View {
1414
@State var updateHeight = false
1515
@State var reloadData = false
1616
@State var reloadRows: [Int] = []
17+
@State var scrollToRow: BBTableViewScrollToRowParameter? = nil
1718
@State var contentOffset: CGPoint = .zero
1819
@State var contentOffsetToScrollAnimated: CGPoint? = nil
1920

@@ -36,8 +37,9 @@ struct TableViewExample: View {
3637
}
3738
.bb_reloadData($reloadData)
3839
.bb_reloadRows($reloadRows)
39-
.bb_contentOffsetToScrollAnimated($contentOffsetToScrollAnimated)
40+
.bb_scrollToRow($scrollToRow)
4041
.bb_contentOffset($contentOffset)
42+
.bb_contentOffsetToScrollAnimated($contentOffsetToScrollAnimated)
4143

4244
Slider(value: $contentOffset.y, in: 0...1000)
4345

@@ -53,8 +55,8 @@ struct TableViewExample: View {
5355
self.list = 0..<100
5456
}
5557
self.updateHeight.toggle()
56-
5758
self.reloadData = true
59+
self.scrollToRow = BBTableViewScrollToRowParameter(row: 0, position: .top, animated: true)
5860
}
5961
.padding()
6062

@@ -65,8 +67,8 @@ struct TableViewExample: View {
6567
self.list = 0..<100
6668
}
6769
self.updateHeight.toggle()
68-
6970
self.reloadRows = (0..<10).map { $0 }
71+
self.scrollToRow = BBTableViewScrollToRowParameter(row: 0, position: .top, animated: true)
7072
}
7173
.padding()
7274
}

0 commit comments

Comments
 (0)