11

UIViewController的parentViewController屬性是隻讀的,但我嵌套自定義視圖控制器並想使用此屬性。如何在UIViewController中設置parentViewController?

但是,由於它是隻讀的,我發現沒有其他方法來設置此屬性,我的問題是:如何我設置它?

顯然,UINavigationController可以在-pushViewController中以某種方式設置屬性,所以可以使用-presentModalViewController,因此它必須是可能的。

我知道我可以添加自己的UIViewController屬性,但我確定parentViewController原則上是正確的屬性。

+0

我認爲誰投下每個答案在這個線程可以給出一個理由:) – willcodejavaforfood 2010-02-17 09:25:31

+0

這不是我,但我懷疑他們不同意使用私人API,並投票下來使用私人API的建議似乎是在SO上通用。也許他們是蘋果痣。 – 2010-05-29 03:43:28

回答

1

但是,由於它是隻讀的,並且我找不到其他方法來設置此屬性,所以我的問題是:如何設置它?

如果是readonly,則不能使用點符號而不會得到compiler error

但是,您可能可以使用categoriesUIViewController類添加自定義modifyParentViewController方法。

即使屬性是隻讀的,如果它不是@protected,變量本身可能是可修改的。如果它是@protected,則視圖控制器的子類可能允許您選擇修改該變量。

+0

這樣做對我來說太髒了,但我想如果我堅持使用parentViewController,這將是非常唯一可行的方法。
雖然我會使用自定義的UIViewController屬性。 – mrueg 2009-09-10 22:22:23

0

parentViewController是出於NavigationViewControllers和呈現模式視圖控制器的目的,沒有辦法設置屬性沒有方法pushViewController或presentModalViewController。 parentViewController是一個只讀屬性,只能由UIViewController類和UINavigationController類讀取,這些類的子類將無法訪問以設置屬性。

2

我試過亞歷克斯的建議買UIViewController類別,它在模擬器,但不是在我的手機。這裏是類別

@interface UIViewController (parentSetter) 
-(void)setParentUIViewController:(UIViewController*)parent; 
@end 

@implementation UIViewController (parentSetter) 
-(void)setParentUIViewController:(UIViewController*)parent 
{ 
_parentViewController = parent; 
} 
@end 

它編譯和工作正常,但注意下劃線成員是有點偏離。 這是在針對3.0 SDK編譯時導致鏈接器錯誤的原因。

我有一個容器視圖,有2個子視圖,表是其中之一。該表需要一個父項,以便可以與導航欄進行交互等等。

我用這個方法,而不是去:

@interface AdoptedTableViewController : UITableViewController { 
    UIViewController* surrogateParent; 
} 

-(UINavigationController*)navigationController; 
@property (nonatomic, assign) IBOutlet UIViewController *surrogateParent; 
@end 

@implementation AdoptedTableViewController 
@synthesize surrogateParent; 

-(UINavigationController*)navigationController 
{ 
    if([super navigationController])//self.navigationController) 
    { 
     return [super navigationController]; 
    } 
    else 
    { 
     return surrogateParent.navigationController; 
    } 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

我所有的表視圖控制器現在adoptedTableViewControllers。他們需要父母的主要原因是他們可以將視圖控制器推到導航堆棧上,以便通過導航控制器獲取器進行透明處理。

這將是很好,如果parentViewController不只是只讀,但在我的涉足_parentViewController我發現有更多的ViewController層次結構不只是該屬性。我認爲這種關係中可能存在着許多耦合和責任,蘋果沒有爲羣衆清理足夠的空間。例如,當我向上移動我無法修復的導航層次結構時,我注意到一個奇怪的取消選擇行爲。也許UINavigation控制器反映他們的頂級控制器的類別,行爲有所不同?

總之,它確實是只讀的,沒有乾淨或簡單的解決方法。你只需要圍繞它構建。

0

它看起來像調用setParentViewController:方法的作品。

[childViewController setParentViewController:self]; 

但是,這仍然會生成一個編譯器警告。其中,國際海事組織,意味着不這樣做(我代之以)。

11

解決辦法是:

- (void)setParentController:(UIViewController*)parent{ 
[self setValue:parent forKey:@"_parentViewController"]; 
    } 

它不會導致連接問題!

PS:不要用「setParentViewController」作爲方法的名稱,因爲這種方法在私有API和蘋果存在說: 「包含在你的應用程序中的非公開API是setParentViewController :.

如果您已經在源代碼中定義了一個與上述API名稱相同的方法,但我們建議更改您的方法名稱,使其不再與Apple的私有API衝突,以避免將您的應用程序標記爲未來提交的內容。在下次更新中解決此問題...「

+2

這不會導致App Store拒絕?這解決了我的一些模態演示問題,但它很可怕。 – 2012-10-24 14:52:51

9

我意識到這個問題是在iOS 5之前問過的,但是對於參考,當你想嵌套UIViewControllers時,你應該使用addChildViewController。這也會自動設置parentViewController屬性。

- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0); 

你可以閱讀更多關於Apple「創建自定義內容視圖控制器」。

+1

這適用於我,在子視圖控制器上設置parentViewController屬性。不知道爲什麼它不是被接受的答案。 – KyleStew 2013-05-09 14:08:11

相關問題