“`html

Swift 在 UITableView 中實現下拉刷新功能 | 2025 最新教學

在 iOS 開發中,UITableView 是一個非常常用的元件,它能讓開發者快速建立列表。然而,有時候我們需要在 UITableView 中添加下拉刷新的功能,讓使用者能夠輕鬆地更新資料。在 Swift 中,可以透過 UIRefreshControl 來快速實現這個功能。

步驟一:建立 UITableView

首先,在你的 ViewController 中建立一個 UITableView,並設置其基本屬性。以下是建立 UITableView 的基本步驟:

class ViewController: UIViewController, UITableViewDataSource {
    var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView = UITableView(frame: self.view.bounds)
        tableView.dataSource = self
        self.view.addSubview(tableView)
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20 // 返回資料數量
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
        cell.textLabel?.text = "Row \(indexPath.row)"
        return cell
    }
}

步驟二:添加 UIRefreshControl

接下來,我們要在 UITableView 上添加 UIRefreshControl,讓我們的使用者能夠實現下拉刷新功能:

let refreshControl = UIRefreshControl()
tableView.refreshControl = refreshControl

步驟三:設置刷新事件

UIRefreshControl 添加事件,當使用者下拉時觸發更新資料的函式:

refreshControl.addTarget(self, action: #selector(refreshData), for: .valueChanged)

@objc func refreshData() {
    // 更新資料的邏輯
    // 假設這裡進行網路請求更新資料
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        // 模擬資料更新
        self.tableView.reloadData()
        self.refreshControl.endRefreshing()
    }
}

步驟四:設置刷新提示

最後,我們可以在 UIRefreshControl 上設置提示文字,讓使用者知道他們正在進行的操作:

refreshControl.attributedTitle = NSAttributedString(string: "正在更新資料...")

現在,你已經成功為 UITableView 實現了下拉刷新功能。當使用者下拉時,將會觸發我們的事件,並且更新資料。

常見問題解答 (Q&A)

如何在下拉刷新中顯示網路請求的結果?

refreshData() 方法中,你可以添加網路請求的邏輯,並在數據更新後重新載入 UITableView 的數據。

UIRefreshControl 可以在其他元件中使用嗎?

是的,UIRefreshControl 不僅可以用於 UITableView,也可以用於 UICollectionView 等其他滾動元件。

如何自訂 UIRefreshControl 的外觀?

你可以修改 UIRefreshControl 的背景色、文字顏色等屬性,來達到自訂的效果。

Swift 在 UITableView 上面添加下拉刷新 | 加入 UIRefreshControl
“`

Categorized in:

Tagged in:

,