• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 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原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/iCloudEnd/article/details/104121980

    智能推薦

    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 一個任務組合監控一個獨立的單元,然后我們就可以知道這一組任務什么時候完成了。 總覽 通過組,您可以聚合一組任務并同步組...

    精品国产乱码久久久久久蜜桃不卡