[英]What is the difference between UIViewController and UITableViewController
有時我想將UIViewController子類化為一些應用程序范圍的自定義。 例如。 所有視圖控制器應在viewDidLoad或viewWillAppear左右執行的操作。
當然,我是UIViewController的子類,並從那里開始,所有視圖控制器都繼承自那里。 但是一些控制器運行表。 還有為此目的設計的UITableViewController。
所以我也是UITableViewController的子類,只是在那里做同樣的事情。 在OOP術語中,這似乎不是最聰明的事情。 而且沒有多重繼承等。
因為UITableViewController繼承自UIViewController ......
現在我問自己為什么我不只是創建自己的表視圖控制器,它繼承自我自己的視圖控制器子類並添加所有表的東西。 但什么是“所有的桌子” ?
所以盡管有明顯的東西,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:這樣,如果用戶點擊導航欄中的“編輯”|“完成”按鈕,控制器將切換表格的編輯模式。
所有這些行為都應該很容易重新實現,如果它們適用於您的特定控制器和表視圖。
一般來說,我發現最好自己實現這些行為,以便允許你注意到的備用繼承層次結構,因為我通常會考慮將表視圖的delagate
和datasource
設置為視圖控制器的設計氣味。 這些是獨立的關注點,通常可以並且應該由其他類(例如,特定模型類的專用數據源)處理,而不是膨脹視圖控制器。
所以盡管有明顯的東西,UITableViewController還有什么奇跡需要處理嗎?
不是我知道的。 據我所知, UITableViewController
主要是一個便利類,可以用你自己的子類替換,增加幾行代碼。
Apple的類文檔幾乎說明了UITableViewController
所做的一切(我在這里不再重復,因為它將來可能會發生變化)。 有時,可以從類的頭文件中收集其他信息,但在UITableViewController.h
的情況下,源代碼注釋只重復類docs中已有的內容。
最后,您必須自己決定要在自己的子類中復制什么。 也許您的項目不需要.nib處理? 或者您的表格視圖都不可編輯? 所以只是不要編碼......
看來UITableViewController
會處理很多管理問題,如果你願意,你可以為自己做些什么。 查看文檔 - 它將自動為您創建UITableView
,重新加載它等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.