2013-05-30 17 views
0

我需要以編程方式遍歷故事板層次結構的幫助。這張圖片應該給出一些上下文:storyboard。該分層結構由一個splitViewController組成,其主控是一個帶有三個選項卡的tabViewController。第一個標籤包含兩個容器視圖,下面的視圖是'問題孩子'。爲masterController位於容器視圖中的splitViewController指派委託

我已經成功穿越層次,併爲接頭2和3的委託分配給detailViewController的masterViewController:

UISplitViewController *splitViewController = (UISplitViewController *) self.window.rootViewController; 
    UITabBarController *masterTabBarController = [[splitViewController viewControllers] objectAtIndex:0]; 
MasterViewController *masterViewController2 = [[masterTabBarController viewControllers] objectAtIndex:1]; 
MasterViewController *masterViewController3 = [[masterTabBarController viewControllers] objectAtIndex:2]; 
masterViewController2.delegate = detailTableViewController; 
masterViewController3.delegate = detailTableViewController; 

然而,標籤1一直因爲容器的觀點更令人側目。我嘗試沒有奏效,並導致索引出界外的錯誤:

UIViewController *containerViewController = [[masterTabBarController viewControllers] objectAtIndex:0]; 
MasterViewController *masterViewController1 = [[containerViewController childViewControllers] objectAtIndex:1]; 
masterViewController1.delegate = detailTableViewController; 

因此而不是AppDelegate中,我也試着我的MasterViewController自身內的其他兩條路線:

- (void)viewDidLoad 
{ 
    self.delegate = (DetailTableViewController *)[[self.splitViewController.viewControllers lastObject] presentedViewController]; 

//self.delegate = [[self.parentViewController.parentViewController.parentViewController.childViewControllers objectAtIndex:1] objectAtIndex:0]; Granted this should ONLY work for tab 1...but it doesnt. 
} 

但未註釋的行返回零...

所以我希望有些靈魂理解容器視圖(因爲有驚人的關於這些被發現的小細節)以及如何通過遍歷訪問和分配委託給他們或其他一些技術。必須有更好的方式 - 我在這裏有一個非常小的應用程序;我無法想象必須單獨走幾十個屏幕的複雜應用程序的層次結構。

在此先感謝!

+0

有沒有黑魔法,當涉及到容器和子視圖控制器。你的第一個解決方案對我來說看起來沒問題,只要孩子能正確地鏈接到他們的父母。由於在不到2個對象'[containerViewController childViewControllers]',或者您的視圖控制器層次結構設置不正確,或'containerViewController'不是對象,你認爲它是。你能否展示更多代碼,直到你設置'containerViewController'的值爲止,你是如何遍歷視圖控制器層次結構的? – herzbube

+0

哇,我也無意離開了這個代碼的關鍵行[將編輯的問題以及]: '的UIViewController * containerViewController = [[masterTabBarController viewControllers] objectAtIndex:0];' 此行是唯一缺少的代碼從我以前發佈的鏈接。這當然是爲了提供對容納所述兩個容器的觀點了UIView,下部容器視圖被關注的一個基準的。所以,當我實例containerViewController我希望調用'[containerViewController childViewControllers] objectAtIndex:1]'將返回我需要什麼... – OneManBand

回答

0

爲了找到解決我的問題的方法,我嘗試在全新的故事板中以較小的比例模擬我的問題,確保所有連接和代碼都已正確設置。然後,當我設置容器視圖時,它開始變得明亮起來:

在故事板中,容器視圖自動定義爲「嵌入段」,並且在技術上與它們所在的屏幕無關。因此,您不能簡單地要求「父」視圖的子項,並期望獲取容器視圖的數組。

因此,爲了將數據傳遞入和限定爲所討論的容器的觀點代表,我提出的自定義類爲容納在容器的觀點和完全忽略的AppDelegate的圖。在這個類中我定義了一個prepareForSegue功能:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    SingletonObject *data = [[SingletonObject alloc] init]; 

    if([segue.identifier isEqualToString:@"containerView1SegueID"]) 
    { 

    } 
    else if([segue.identifier isEqualToString:@"tableEmbedSegue"]) 
    { 
     MasterViewController *masterViewController0 = segue.destinationViewController; 

     [[segue destinationViewController] setDelegate:data.detailTableViewController]; 
     //^Or more specifically, 'masterViewController0.delegate = data.detailTableViewController;' would also work 
    } 
} 

我希望這能幫助誰是有集裝箱的意見困難的人。他們不是孩子!他們嵌入賽段。使用prepareForSegue,你會很高興。

0

我沒有解決方案,但我正在寫這個答案,因爲它給了我更多的空間來闡述。

與您提供的故事板圖像相比,您的代碼看起來是正確的。儘管我不習慣故事板,但我更喜歡以編程方式設置所有內容,所以我可能會錯。但是:我做了一個快速測試項目,試圖複製你的故事板。我然後複製&粘貼您的代碼檢索masterViewController1逐字寫入我的測試項目,並且一切都完美!

結論:您的故事板中的任何內容都設置錯誤。或者你的代碼中沒有顯示的東西意外地改變了容器/子關係。

我的建議:檢查你的故事板。如果你沒有看到這個錯誤,可以從頭開始一個新的故事板,也許在一個單獨的項目中。從簡單開始並驗證每一步。一旦你到達正確的設置,你可以比較新的故事板和舊的故事板來找到錯誤。

我知道這是極其普遍的建議,但考慮到目前的情況,我不知道你還能做什麼。祝你好運。

+0

嘿 - 我只想說,我很感謝您的反饋,這是有幫助的,herzbube。我會用我最終的發現來回答我自己的問題,並且給我更多的空間來闡述。 – OneManBand

+0

@OneManBand很高興聽到你找到了解決辦法。繼續編碼:-) – herzbube