2015-05-24 74 views
1

我有很多共同的邏輯,因此我所有的viewController都繼承自BaseViewController,BaseDetailsViewController或BaseWebViewController。最後兩個繼承自從UIViewController繼承的BaseViewController。問題是我不能使用tableViews靜態單元格,因爲我的BaseDetailsViewController不是從UITableViewController繼承。如何用靜態單元支持重新創建UITableViewController?

我從來沒有使用和繼承UITableViewController,因爲可以通過從UIViewController繼承來實現,使用添加的UITableView進行連接並實現了數據源和委託方法。因此,對於表單類型的屏幕(註冊或其他數據輸入屏幕),我用我自己的BaseDetailsViewController這增加了很好的和方便的方法(輸入驗證,定製造型,滾動鍵盤,手柄輸入欄導航等)

使用的UITableViewController有兩個真正的好處:1)鍵盤滾動(如果你使用文本字段)和2)在屏幕上輕鬆創建你的表單UI元素。第一個好處是我無關緊要,因爲我已經在BaseDetailsViewController裏面自己實現了這個東西。關於第二個好處,我在scrollView中創建了我的表單,它提供了很大的靈活性,但是它更加努力(特別是當需要更新屏幕時)。因此我聽說有些人實現了自己的UITableViewController,然後使它從BaseViewController繼承。因此我開始深入研究這種方法。

到目前爲止,我心中已經臨到這兩種方法:

  1. Recreate your own tableVC。不清楚如何使它適用於靜態單元。目前我的演示程序崩潰,如果我的ReplaceTableViewController沒有實現numberOfRows和cellForRow,並且不顯示靜態單元格,如果我用虛擬內容實現它們。
  2. method-swizzling。不清楚如何通過爲UITableViewController注入baseViewController繼承來更改類繼承,但仍然不清楚需要添加哪些方法。

有人試過,想分享嗎?

UPDATE我沒有使用故事板作爲我推進清潔MVC - 每個屏幕組件應該有自己的模型,視圖(XIB)和控制器,所有存儲在單獨的文件,以消除合併多個開發者的衝突大型應用程序項目(30多個屏幕)。因此,嵌入segue到tableViewController的容器視圖也不是一個選項。

UPDATE2如果有人想看看,爲什麼,以及如何我這樣做,這裏是我的開源template based new project generator framework我開始最近發佈的鏈接。

+1

那麼,爲什麼你不使用tvc?你的問題很長,不太清楚你要問什麼。 – Schemetrical

+0

所以你真的想要使用自定義的VC,並且在故事板中使用最少的代碼來設計你的表格? – Wain

+0

@Schemetrical。我所有的viewControllers直接或間接從繼承自UIViewController的BaseViewController繼承。這不允許使用靜態單元格的tableView。我不想使用tvc,因爲那樣我將無法在所有viewControllers上使用通用的功能(BaseViewController)(無代碼重複)。問題是如何在不使用tvc和storyboard的情況下使靜態單元工作。 – Centurion

回答

1

靜態單元需要一個UITableViewController。你現在不能改變這個。

但是要在UITableViewController之外的UITableView中使用靜態單元,您可以在Non-Table-UIViewController中使用ContainerView,在這裏放置一個真正的單獨創建的UITableViewController,使用這些靜態單元。

要在多個視圖控制器之間共享通用代碼,繼承並不是你自己在UIViewController和UITableViewController的子類化時發現的最佳解決方案。您可以使用某種組合來共享代碼,特別是對於Objective-C類別。

類別不允許有自己的屬性,但有workarounds possible with objc_setAssociatedObject

另一種方法是不使用靜態的細胞,但細胞活力與數據源,代表:)

正如你在我的截圖看到,重用與靜態細胞特殊的TableView,我把它放在一個UITableView ContainerView中的其他ViewControllers。既然你不使用故事板,我敢肯定,這也可以通過沒有故事板的代碼來完成。

enter image description here

+0

我同意作文,然而正如我在評論中寫的,你可能知道非常細化的分解會使代碼複雜化,有時並非必要。我所有的通用代碼已經解耦成單獨的類並通過接口訪問,但viewController UI特定的通用代碼恰好位於這些BaseViewController內部。強迫改變這種情況不會有任何真正的好處。與此同時,我更關心大衆故事板的欣快感,因爲它真的壓制了問題的分離和乾淨的MVC方法,並引入了不必要的合併衝突。 – Centurion

+0

是的,故事板可以真的搞砸了,尤其是當多於一個人在工作時。實際上你的情況是,不可能在UITableViewController中重用自定義的UIViewController子類,從而阻止我在這裏進行子類化。我的數據綁定來自基於ReactiveCocoa的DataModel,所以我不需要擁有巨大的ViewController。事實上,他們是非常小的 – itinance

+0

如果你有興趣發表評論,我開始推動我的基於開源模板的項目生成器框架(https://github.com/GitTennis/SuccessFramework/tree/master/Templates/_BusinessApp_),它實現了我所說的所有這些事情。我考慮過ReactiveCocoa,儘管我通常會盡量避免使用KVO,可能是因爲廣播的通知太多,導致堆棧跟蹤氾濫,並且很難調試。相反,我使用模型和數據對象的老派類型分離,並手動進行視圖模型綁定。無論如何,很多不同的方式如何去.. – Centurion

相關問題