讀古今文學網 > iOS編程基礎:Swift、Xcode和Cocoa入門指南 > 11.5 數據源 >

11.5 數據源

數據源類似於委託,只不過它的方法提供了供其他對像顯示的數據。Cocoa中帶有數據源的類主要有UITableView、UICollectionView、UIPickerView與UIPageView-Controller。對於每個類來說,數據源必須要正式使用數據源協議並實現必需的方法。

有些初學者對於數據源的必要性感到驚奇。為何表數據不是表的一部分?為何要有一些包含著數據的固定的數據結構?原因在於這種架構違背了一般性。使用數據源可以將顯示數據的對象與管理數據的對象分離開來,後者可以自由存儲和獲取所需的數據(參見第13章的模型—視圖—控制器)。唯一的要求就是數據源必須能快速提供信息,因為當需要顯示數據時會實時地向數據源請求數據。

另一個驚奇之處在於數據源不同於委託。但這又回到一般性問題了;這是一個選項而不是必需的。並沒有什麼理由限制數據源與委託不能成為同一個對象,大多數時候它們可能都是一樣的。實際上,在大多數情況下,數據源方法與委託方法可以密切配合;你可能都意識不到這種差別。

下面這個示例來自於我編寫的應用,它實現了UIPickerView,讓用戶可以根據自己輸入的階段數(「1階段」「2階段」等)來配置遊戲。前兩個是UIPickerView數據源方法;第3個是UIPickerView委託方法。它通過這3個方法向選擇器視圖提供內容。


extension NewGameController: UIPickerViewDelegate, UIPickerViewDataSource {
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(pickerView: UIPickerView,
        numberOfRowsInComponent component: Int) -> Int {
            return 9
    }
    func pickerView(pickerView: UIPickerView,
        titleForRow row: Int, forComponent component: Int) -> String? {
            return "\(row+1) Stage" + ( row > 0 ? "s" : "")
    }
}