2010-11-03 35 views
1

我有一個可重用的UITableViewController子類,稱之爲「tableVC」。選擇一個表格行將該詳細視圖控制器壓入導航堆棧。當tableVC實例被自己推入時,它只有一個有效的navController。到現在爲止還挺好。如何引用superview的navigationController

我需要將tableVC的視圖嵌入到其viewController已推入的另一個視圖中。由於superview的viewController已被推送,它有一個有效的navCon。我無法從tableVC獲取那個navCon,因爲tableVC沒有被推送,所以完全可重用的tableVC無法推送細節。 有沒有一種乾淨的方式來引用navCon,而不是在特殊的UINavigationController變量中進行黑客攻擊,如果self.navigationController是零,那麼訪問黑客?看起來像一個普遍的情況,應該有一個最佳實踐。 任何見解都非常感謝。 -Mike

回答

4

簡短的回答據我所知沒有,有沒有其他的方式來獲得在導航控制器,你是後。

介質答案是,你可以覆蓋你的表視圖控制器的navigationController屬性,以使其可寫:

@interface myTableViewController : UITableViewController { 
    UINavigationController *navigationController; 
} 
@property (nonatomic, retain) UINavigationController *navigationController; 

這將使你把它設置爲推動VC的導航控制器,當您添加視圖作爲子視圖。當您正常將它推到導航控制器堆棧上時,它也會按照承諾一樣工作。

長答案是蘋果不鼓勵你在做什麼。從View Controller Programming Guide"About Custom View Controllers"

注意:如果你想要一個 屏幕分成多個區域,分別管理 各一臺,使用通用 控制器對象(自定義對象 從NSObject的下降),而不是 視圖控制器對象來管理屏幕的每個 子部分。然後使用一個 單個視圖控制器對象到 管理通用控制器對象。 視圖控制器協調整個屏幕交互 ,但 根據需要將消息轉發到其管理的通用控制器對象。

我遇到了你所描述的問題,並最終採取的方法第suggested by Matt Gallagher on Cocoa with Love:創建一個從NSObject的(而不是UIViewController中)繼承並實現的UITableViewDelegate和UITableViewDataSource管理表視圖單獨的控制器類。如果你決定走這條路,他的帖子裏有示例代碼,非常有用。當我這樣做時,它主要是簡單地改變我的自定義UITableViewController子類中的繼承聲明。

+0

Matt的代碼解決了與我的稍有不同的問題,但是您的討論讓我意識到,不是將一個對NavCon的引用擠入tableVC,而是一個更清晰的設計,用於tableVC委派推送detailVC的工作。謝謝,非常感謝。 – Rayfleck 2010-11-04 13:24:30

0

通過在UIViewController中嵌入UITableViewController,你的意思是什麼?我可以看到如何將UITableView嵌入到UIView中(我有這樣的代碼)。但是嵌入視圖控制器...

當我有一個UIView內的UITableView的,我的子類的UIViewController,並把它落實的UITableViewDelegate和UITableViewDataSource,像這樣:

@interface MyViewController : UIViewController 
     < UITableViewDelegate, UITableViewDataSource > 
//...  
@end 

這樣一個IUViewController工作雙重職責。這會讓你的自包含的UITableViewController在某種程度上受到損害。但是你可以創建一些實現UITableViewDelegate和UITableViewDataSource的委託類,併爲你的UIViewController提供一個被引用的實例(如伊娃)。

只是一個想法...

+0

我沒有嵌入UITableView **控制器**,我嵌入**視圖**。 – Rayfleck 2010-11-04 01:13:05

相關問題