簡體   English   中英

UIViewController和UITableViewController有什么區別

[英]What is the difference between UIViewController and UITableViewController

有時我想將UIViewController子類化為一些應用程序范圍的自定義。 例如。 所有視圖控制器應在viewDidLoad或viewWillAppear左右執行的操作。

當然,我是UIViewController的子類,並從那里開始,所有視圖控制器都繼承自那里。 但是一些控制器運行表。 還有為此目的設計的UITableViewController。

所以我也是UITableViewController的子類,只是在那里做同樣的事情。 在OOP術語中,這似乎不是最聰明的事情。 而且沒有多重繼承等。

因為UITableViewController繼承自UIViewController ......

現在我問自己為什么我不只是創建自己的表視圖控制器,它繼承自我自己的視圖控制器子類並添加所有表的東西。 但什么是“所有的桌子”

  • 有一個xcode添加到每個新表視圖控制器的框架代碼。 非常方便,但可以很容易地轉移到代碼片段。
  • 有UITableViewDelegate和UITableViewDataSource協議的聲明。 隨和。 無論如何,這些方法的實現必須遵循UITableViewController的每個子類。
  • 協議中所有這些強制方法可能都有合理的默認實現。 比如為numberOfSectionsInTableView返回0:或者為titleForHeaderInSection返回nil,或者為heightForRowAtIndexPath返回44.0f :(雖然這是個壞例子。可能更聰明,根本沒有實現)

所以盡管有明顯的東西,UITableViewController還有什么奇跡需要處理嗎?

我相信UITableViewController添加的所有行為都在類文檔中有明確定義: https//developer.apple.com/documentation/uikit/uitableviewcontroller?language = objc

UITableViewController類創建一個管理表視圖的控制器對象。 它實現了以下行為:

•如果通過initWithNibName:bundle:方法(由超類UIViewController聲明)指定了nib文件,UITableViewController將加載在nib文件中存檔的表視圖。 否則,它會創建一個具有正確尺寸和自動調整大小掩碼的未配置UITableView對象。 您可以通過tableView屬性訪問此視圖。

•如果加載了包含表視圖的nib文件,則數據源和委托將成為nib文件中定義的對象(如果有)。 如果未指定nib文件或者nib文件未定義數據源或委托,則UITableViewController將表視圖的數據源和委托設置為self。

•當表視圖即將在第一次加載時出現時,表視圖控制器會重新加載表視圖的數據。 每次顯示表格視圖時,它還會清除其選擇(有或沒有動畫,具體取決於請求)。 UITableViewController類在超類方法viewWillAppear中實現它: 您可以通過更改clearsSelectionOnViewWillAppear屬性中的值來禁用此行為。

•出現表格視圖時,控制器會閃爍表格視圖的滾動指示。 UITableViewController類在超類方法viewDidAppear中實現它:

•它實現了超類方法setEditing:animated:這樣,如果用戶點擊導航欄中的“編輯”|“完成”按鈕,控制器將切換表格的編輯模式。

所有這些行為都應該很容易重新實現,如果它們適用於您的特定控制器和表視圖。

一般來說,我發現最好自己實現這些行為,以便允許你注意到的備用繼承層次結構,因為我通常會考慮將表視圖的delagatedatasource設置為視圖控制器的設計氣味。 這些是獨立的關注點,通常可以並且應該由其他類(例如,特定模型類的專用數據源)處理,而不是膨脹視圖控制器。

所以盡管有明顯的東西,UITableViewController還有什么奇跡需要處理嗎?

不是我知道的。 據我所知, UITableViewController主要是一個便利類,可以用你自己的子類替換,增加幾行代碼。

Apple的類文檔幾乎說明了UITableViewController所做的一切(我在這里不再重復,因為它將來可能會發生變化)。 有時,可以從類的頭文件中收集其他信息,但在UITableViewController.h的情況下,源代碼注釋只重復類docs中已有的內容。

最后,您必須自己決定要在自己的子類中復制什么。 也許您的項目不需要.nib處理? 或者您的表格視圖都不可編輯? 所以只是不要編碼......

看來UITableViewController會處理很多管理問題,如果你願意,你可以為自己做些什么。 查看文檔 - 它將自動為您創建UITableView ,重新加載它等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM