SwiftUI 中級之下拉更新PullRefresh (2020年教程)
SwiftUI 中級之下拉更新PullRefresh (2020年教程)
將之前等代碼封裝成struct
import SwiftUI
public struct PullToRefresh: UIViewRepresentable {
let action: () -> Void
@Binding var isShowing: Bool
public init(
action: @escaping () -> Void,
isShowing: Binding<Bool>
) {
self.action = action
_isShowing = isShowing
}
public class Coordinator {
let action: () -> Void
let isShowing: Binding<Bool>
init(
action: @escaping () -> Void,
isShowing: Binding<Bool>
) {
self.action = action
self.isShowing = isShowing
}
@objc
func onValueChanged() {
isShowing.wrappedValue = true
action()
}
}
public func makeUIView(context: UIViewRepresentableContext<PullToRefresh>) -> UIView {
return UIView(frame: .zero)
}
private func tableView(root: UIView) -> UITableView? {
for subview in root.subviews {
if let tableView = subview as? UITableView {
return tableView
} else if let tableView = tableView(root: subview) {
return tableView
}
}
return nil
}
public func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<PullToRefresh>) {
DispatchQueue.main.asyncAfter(deadline: .now()) {
guard let viewHost = uiView.superview?.superview else {
return
}
guard let tableView = self.tableView(root: viewHost) else {
return
}
if let refreshControl = tableView.refreshControl {
if self.isShowing {
refreshControl.beginRefreshing()
} else {
refreshControl.endRefreshing()
}
return
}
let refreshControl = UIRefreshControl()
refreshControl.addTarget(context.coordinator, action: #selector(Coordinator.onValueChanged), for: .valueChanged)
tableView.refreshControl = refreshControl
}
}
public func makeCoordinator() -> Coordinator {
return Coordinator(action: action, isShowing: $isShowing)
}
}
做個下拉更新時間等demo
import SwiftUI
struct TimePullRefreshView: View {
@State var isShowing: Bool = false
@State var array = ["date"]
var body: some View {
NavigationView {
List(array, id: \.self) { text in
Text(text)
}
.navigationBarTitle("刷新時間")
}
.background(PullToRefresh(action: {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.isShowing = false
//self.array.append(Date().description)
self.array.insert(Date().description, at: 0)
}
}, isShowing: $isShowing))
}
}
struct TimePullRefreshView_Previews: PreviewProvider {
static var previews: some View {
TimePullRefreshView()
}
}
更多SwiftUI教程和代碼關注專欄
- 請關注我的專欄icloudend, SwiftUI教程與源碼
https://www.jianshu.com/c/7b3e3b671970
智能推薦
SwiftUI官方教程解讀
原文鏈接:https://www.jianshu.com/p/ecfdbea7a0ed SwiftUI簡介 SwiftUI是wwdc2019發布的一個新的UI框架,通過聲明和修改視圖來布局UI和創建流暢的動畫效果。并且我們可以通過狀態變量來進行數據綁定實現一次性布局;Xcode 11 內建了直觀的新設計工具canvus,在整個開發過程中,預覽可視化與代碼可編輯性能同時支持并交互,讓我們可以體驗到代...
SwiftUI 官方教程 (十)
由于 API 變動,此文章部分內容已失效,最新完整中文教程及代碼請查看 https://github.com/WillieWangWei/SwiftUI-Tutorials 創建 watchOS App 本教程為你提供一個將你已經學到的關于 SwiftUI 的知識應用到自己的產品上的機會,并且不費吹灰之力就可以將 Landmarks app 遷移到 watchOS 上。 首先,給項目添加一個 wa...
SwiftUI 官方教程 (一)
由于 API 變動,此文章部分內容已失效,最新完整中文教程及代碼請查看 https://github.com/WillieWangWei/SwiftUI-Tutorials SwiftUI 簡介 SwiftUI 是一種為任何 Apple 平臺聲明用戶界面的現代化方式。以前所未有的速度,創建漂亮、動態的應用程序。 只需要描述一次的布局 為你的視圖聲明任何狀態的內容和布局,一旦狀態發生改變, Swif...
SwiftUI Button 基礎教程
Button 觸發時執行操作的控件 使用教程 您可以通過提供操作和標簽來創建按鈕。操作是一個方法或閉包屬性,當用戶單擊或輕觸按鈕時,它會執行某些操作。標簽是描述按鈕操作的視圖,例如,通過顯示文本(如取消)或圖標(如后退箭頭)。 代碼 iOSButton效果 macOS代碼 tvOS代碼 推薦 基礎文章推薦 《SwiftUI是什么,聽聽大牛們如何說》 經典教程推薦 更新近百篇SwiftUI教程《Sw...
[譯] SwiftUI 官方教程 (一)
SwiftUI 簡介 SwiftUI 是一種為任何 Apple 平臺聲明用戶界面的現代化方式。以前所未有的速度,創建漂亮、動態的應用程序。 只需要描述一次的布局 為你的視圖聲明任何狀態的內容和布局,一旦狀態發生改變, SwiftUI 會自動更新視圖的渲染。 構建可復用的組件 將小型、獨立視圖組合到更大,更復雜的界面中。在任何為 Apple 平臺所設計的應用之間,共享您的自定義視圖。 ...
猜你喜歡
SwiftUI 復用舊項目代碼之UIViewcontroller(2020版教程)
SwiftUI 復用舊項目代碼之UIViewcontroller(2020版教程) SwiftUI 非常好用,開發界面高效快捷,但是具體到業務層面,復用歷史代碼是必須要研究到事情。 如何在SwiftUI中調用UIViewcontroller 1、 創建一個 Wrapper 例如我們有個Example1ViewController舊代碼,我們可以先通過UIViewControllerRepresen...
SwiftUI guard 是什么如何用(2020教程)
guard 是一種控制流語句 通俗講guard和if-else、switch同屬于控制流范疇語句,if-esle和switch都屬于上古語句歷史悠久,guard肯定是后來者。 后來者的出現肯定是要解決一些前人無法解決的問題。記得有位大神說過“當你開始寫switch時,你代碼就開始墮落了”,可見switch語句時多么不受高手們的喜愛。 guard是swift 2.0引入的,他...
SwiftUI實戰之多組選擇器Picker(2020教程)
在UIKit里我們可以使用UIPickerView實現多組聯合選擇器,但是在SwiftUI該如何實現 呢? 本文價值與收獲 看完本文后,您將能夠作出下面的界面 [email protected] Jietu20200305-195926.gif 看完本文您將掌握的技能 獲取到多組Picker源碼,用于自己到項目 掌握套路,和tabview顯示未閱讀效果原理一樣《SwiftUI實...
SwiftUI 動畫控制運行軌跡之Curve(2020教程)
歡迎訂閱專欄《SwiftUI 2020教程》 本文價值與收獲 看完本文后,您將能夠作出下面的動畫 四種內置曲線運動效果 四種內置曲線運動效果 看完本文您將掌握的技能 掌握4種內置動畫曲線使用 實現移動 實現顏色變換 欣賞遠古壁畫 QQ:3365059189 SwiftUI技術交流QQ群:518696470 動畫曲線是一種在整個動畫過程中表達速度的方式。在前面的示例中,您看到了“ eas...
SwiftUI 內功GCD教程之DispatchGroup基礎使用實現同步更新(教程含源碼)
實戰需求 SwiftUI GCD教程之DispatchGroup基礎使用實現同步更新 本文價值與收獲 看完本文后,您將能夠作出下面的界面 看完本文您將掌握的技能 管理一組TextField 使用ScrollView 設置圓形TextField 基礎知識 DispatchGroup 一個任務組合監控一個獨立的單元,然后我們就可以知道這一組任務什么時候完成了。 總覽 通過組,您可以聚合一組任務并同步組...