2017-07-07 67 views
0

我正在做一個重構,因爲我的UITableViewController膨脹得很厲害。我想要做的第一件事就是重構數據源出這樣的表視圖控制器:在UITableViewDataSource類中使用UITableViewController邏輯

// In my UITableViewController 
let ds = MyDataSource() 

func viewDidLoad() { 
    tableView.dataSource = ds 
} 

在我的數據源類,我想用一些邏輯,我覺得在表中應該屬於視圖控制器。

class MyDataSource: UITableViewDataSource { 
    func numberOfSections(in tableView: UITableView) -> Int { 
    // I want to use the variable showMore here 
    return showMore ? 2 : 1 
    } 

    // More data source doe 
} 

可變showMore是在我的表視圖控制器定義的布爾變量,並且通過在一個段的頁腳視圖按鈕更新。

問題是,如果showMore屬於表視圖控制器,我如何從我的數據源類訪問它?如果它不屬於 表視圖控制器,它屬於哪裏,爲什麼?

謝謝!

+0

將屬性showMore添加到VC和DS中。只要它在VC中發生變化,就將其傳遞給DS,然後重新載入您的表格。或者只保留在DS中,當用戶按下按鈕時,告訴DS更新值並重新加載表格。 – Koen

回答

0

首先想到的一些新想法 - 而我只是打字,在Xcode不寫......

// footerButtonTap 
if let ds = tableView.dataSource as? MyDataSource { 
    ds.showMore = !ds.showMore 
    tableView.reloadData() 
} 

或者類似的規定可能適合您的需求。

+1

'showMore'可以附加一個'didSet',它實際上會根據其值 –

0

UITableViewController是Apple的UIViewController的便捷實現,它包含一個tableView而不是一個視圖,以及立即符合UITableViewDataSourceUITableViewDelegate。我建議你只需使用UIViewController並添加一個tableView,然後按照您的設置將表的委託和數據源設置爲MyCustomTableController,這將符合UITableViewDataSourceUITableViewDelegate。所有的邏輯都應該在控制器內部處理。

+0

更改元素的理解,但我的表視圖控制器正膨脹到+1000行..它變得非常難以維護和添加功能/調試,因此這個問題。 – 7ball

+0

是的,這就是爲什麼我建議你把你的桌子視圖控制器分開。 – cloudcal