2015-08-23 29 views
2

我想開始使用swift來創建一個小列表的應用程序。我打算使用兩個表視圖控制器來顯示這兩個列表,並想知道是否有可能讓它們共享一個公共數據源。Swift - iOS - 共享單個數據源的多個表視圖控制器。

本質上,數據只是一個項目名稱,兩個整數代表所擁有的項目數量和需要的數量。當一個數字增加時,另一個數字減少,反之亦然。

我想這可能是使用這兩個表視圖控制器所使用的單一數據源最容易做到的。

我做了一些關於共享數據源的搜索,並沒有發現任何有用的東西來幫助我實現這一點。如果有什麼好的參考資料可供我參考,請點他們的方向!

+0

第一個和第二個表視圖控制器有什麼區別?您可以只使用一個,並在cellForRowAtIndexPath方法中檢查您需要爲部分 – azimov

+0

中的每個案例顯示哪些單元格,並根據需要創建儘可能多的表格視圖,然後按照通常方式執行操作,但使用自定義UITableViewCell並設置一個將自定義單元格的屬性設置爲「擁有」和「需要」,在tableview中要顯示「擁有」激活擁有的屬性,在tableview中顯示所需的激活所需屬性。根據需要從服務器中相互減去一個或重複,就是這樣吧 – Loxx

+0

你真的想共享數據源嗎?您將在這些視圖控制器之間引入緊密耦合,這可能會在未來導致維護問題。您可能會共享一個模型,但您通常不會建議共享數據源。 – Rob

回答

1

您可以創建一個數據源類,並在這兩個視圖控制器使用它:

class Item { 

} 

class ItemsDataSource: NSObject, UITableViewDataSource { 
    var items: [Item] = [] 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     var cell = tableView.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell 

     //setup cell 
     // ... 

     return cell 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return items.count 
    } 
} 

class FirstViewController : UITableViewController { 
    var dataSource = ItemsDataSource() 

    override func viewDidLoad() { 
     self.tableView.dataSource = dataSource 
     self.tableView.reloadData() 
    } 
} 

class SecondViewController : UITableViewController { 
    var dataSource = ItemsDataSource() 

    override func viewDidLoad() { 
     self.tableView.dataSource = dataSource 
     self.tableView.reloadData() 
    } 
} 
+1

這不是一個單一的數據源,它是來自一個同名類的兩個數據源 –

+0

你是對的。如果作者只需要一個數據源對象,則可以使用單例。 –

0

使用Singleton設計模式,這意味着這兩個表將從相同的情況下得到的數據源

class sharedDataSource : NSObject,UITableViewDataSource{ 

    static var sharedInstance = sharedDataSource(); 
    override init(){ 
     super.init() 
    } 

    //handle here data source 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ 

    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ 

    } 


} 

var tableOne = UITableView(); 
var tableTwo = UITableView(); 

tableOne.dataSource = sharedDataSource.sharedInstance; 
tableTwo.dataSource = sharedDataSource.sharedInstance; 
+1

使用單例提供數據的醜陋解決方案 – azimov

+0

@gottlieb解釋了爲什麼? –

+1

單程可以在程序中隨處訪問和修改,對於實用程序/配置類而言,沒有問題,但不適用於數據提供類。它在不同的INDEPENDENT程序模塊之間創建了一個隱藏的依賴關係,這使得代碼難以讀取和調試,並且是錯誤的根源。 – azimov

0

代表方法的第一個參數是:

func tableView(tableView :UITableView的,的cellForRowAtIndexPath indexPath:NSIndexPath) - >的UITableViewCell {

在這一點上的一個數據源代理可以決定哪個表視圖想要的細胞,例如,相應地返回結果。

相關問題