2010-04-26 80 views
0

我陷入了一個非常奇怪的問題。我創建了自己的UITabBarController來定製它,它工作得很好......除了模態視圖。當我用動畫消除模態視圖(來自UITabBarController的呈現/消除)時,它會等到動畫完成並轉到標籤欄的第一個控制器!iPhone - 關閉UITabBarController的模態視圖

爲什麼控制器會改變?我該如何解決它?

感謝

PS:我的UITabBarController的看法是在主窗口中,有上中的UITabBar一樣。控制器(由標籤欄管理)位於標籤欄控制器視圖上的主窗口上,高度較短。當我展示模態視圖時,我將標籤欄控制器視圖放在前面。

回答

0

我有一些問題:

1)當你說「創建了自己的UITabBarController」你的意思是,你的子類的UITabBarController?

2)如何調用模態視圖控制器?有沒有一個按鈕或某個被點擊的東西來打電話來呈現模態視圖控制器?

你說控制器「在主窗口上」,並且當你顯示模態視圖時,你將「標籤欄控制器視圖置於前面」。這讓我困惑。視圖控制器應該屬於標籤欄控制器。

我創建了一個小項目,把它爲我工作,所以這裏就是我所做的:

1)我創建的UITabBarController的子類:

@interface MyTabBarController : UITabBarController 
{ 
} 

- (IBAction)presentModalView:(id)sender; 
- (void)dismissModalview; 

@end 


@implementation MyTabBarController 

- (IBAction)presentModalView:(id)sender 
{ 
    MyModalViewController* myModalView = [[MyModalViewController alloc] initWithNibName:@"ModalView" bundle:nil]; 
    [myModalView setTbc:self]; 
    [self presentModalViewController:myModalView animated:YES]; 
} 

- (void)dismissModalview; 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 
@end 

2)然後我的模態視圖控制器我創建的UIViewController的一個子類:

@interface MyModalViewController : UIViewController 
{ 
    MyTabBarController* tbc; 
} 

@property (retain) MyTabBarController* tbc; 

- (IBAction)returnToTabBar:(id)sender; 

@end 


@implementation MyModalViewController 

@synthesize tbc; 

- (IBAction)returnToTabBar:(id)sender; 
{ 
    [tbc dismissModalview]; 
} 

@end 

3)I拖動標籤欄控制器插入的MainWindow.xib,設置它的文件的所有者到MyTabBarController,並加入視圖控制器到兩個選項卡(我使用檢查器將每個背景顏色設置爲不同的顏色)。在第二個選項卡的視圖控制器中,我添加了一個按鈕並將其目標設置爲MyTabBarController中的「presentModalView:」動作。

4)我創建了一個新的xib,其中包含一個名爲ModalView的視圖並將其文件所有者設置爲MyModalViewController。我將視圖的背景顏色設置爲與上述兩種不同的顏色,並在視圖中添加了一個按鈕。我將按鈕的目標設置爲MyModalviewController中的動作「returnToTabBar:」。

顯然,我必須在應用程序委託中將標籤欄視圖添加到窗口的子視圖中。這爲我工作,並提出了模態視圖控制器時,我是第二個選項卡上,當我被解僱是我返回到標籤欄控制器中的第二個選項卡。

我希望這有助於!

+0

所以...回答你的問題:1.不是它是UIViewController的子類和2:是它是一個視圖上的按鈕 我所做的是將我的customUITabBarController放在主窗口上,由customUITabBarController)視圖控制器...在我的customUITabBarController的視圖,我有UITabBar。希望它很清楚!我不知道如何更好地解釋 – ncohen 2010-04-28 09:52:16

1

閱讀您的評論我的第一個答案之後,我更好地瞭解你在做什麼,雖然搞清楚到底是怎麼回事錯的是沒有看到的代碼非常困難。我創建了一個自定義的標籤欄控制器(從UIViewController子類),其中一個標籤窗口有一個按鈕,呈現一個模式視圖控制器的另一個項目。當我解散模態視圖時,它會返回到我所在的選項卡上。

在你的問題你說,在標籤欄管理您的視圖控制器是在主窗口中,當你提出你所帶來的標籤欄控制器以前面的模式視圖。這對我沒有意義。

對於我的例子,我做了CustomTabBarControllerUIViewController一個子類,並具有兩個標籤欄項目,和兩個視圖控制器標籤欄製作實例變量。我添加了標籤欄和成員視圖控制器的兩個視圖作爲CustomTabBarController視圖的子視圖(我設置了視圖控制器視圖的框架,使它們不與標籤欄重疊)。我還將CustomTabBarController設置爲標籤欄的代表。當選中一個標籤欄項目時,我發送消息bringSubviewToFront:CustomTabBarController的視圖,並將相應的子視圖作爲參數。

其中一個構件視圖控制器視圖的有一個按鈕,輕敲後,呈現出模態視圖。當按鈕被點擊時,視圖控制器可以調用presentModalViewController:,但是,既然你說過你的標籤欄控制器正在這樣做,我在視圖控制器中有一個IBAction方法(這是顯示模態視圖的按鈕的目標)在撥打presentModalViewController:CustomTabBarController中的方法。視圖控制器具有用於CustomTabBarController的ivar(因爲視圖控制器屬於CustomTabBarController,所以這很容易設置)。

模態視圖控制器類還具有用於CustomTabBarController一個的ivar(I設置此只是調用presentModalViewController:之前),我有在該駁回模態視圖模態視圖的按鈕。該按鈕連接到模態視圖控制器類中的IBAction,然後調用CustomTabBarController中的方法。

一切正常,當我做這種方式符合市場預期。我相信你有你創建自定義標籤欄控制器的理由,但我質疑它是否真的有必要。我希望這有幫助。

+0

嘿,首先非常感謝你花時間回答我......我真的很感激!我想要一個自定義的tabBar,因爲我想以特定的方式管理標籤欄。我希望它有(有時)沒有選擇它,因爲超過5個控制器由標籤欄管理。我也想改變tabbar的高度......無論如何,我真的需要那個!我還需要有時導航欄,有時不需要這樣做,我不得不把我的控制器放在窗口上,而不是在自定義的標籤欄控制器(視圖)上。我可以發送給你,但不能在這裏寫... – ncohen 2010-04-28 23:45:24

+0

我沒有得到沒有選擇任何標籤欄上。如果標籤欄顯示,應該選擇一個標籤不應該嗎?否則,顯示哪個視圖以及該視圖與標籤欄的關係如何?當你說你有時有導航欄,有時候沒有,那是什麼意思呢?這是否意味着在某些標籤視圖中您將擁有一個導航欄,並且有些您不會?你真的確定你的設計是正確的。這聽起來像你的設計是尷尬的,它可以/應該以不同的方式完成。當然不確定,但這就是它的出現方式。 – yabada 2010-04-29 00:23:18

+0

我知道...它看起來很尷尬,但它不是!我想優化我的視圖,所以當不需要的東西時,我會隱藏它。 1)當我點擊一個單元格時,我有一個表格視圖(在我的一個tabBar控制器中)我得到一個帶有導航欄的新控制器......在我的表格視圖中隱藏導航欄是否有意義?對我來說呢! 2)我有一個帶有圖標的主菜單(就像在iPhone OS上)。當我點擊其中一個圖標時,我會進入帶有標籤欄的控制器,但有時菜單不是很重要,所以它不會出現在標籤欄上(使用標籤欄,用戶始終可以訪問重要的菜單) mk感覺? – ncohen 2010-04-29 02:44:34

0

我懷疑你做了很多(太多了?)初始化工作viewDidLoad和其中的一件事情是選擇第一個選項卡?

也許你可以在您的自定義標籤欄控制器類跟我們分享的init /加載的順序?在顯示模態視圖

你的標籤欄控制器視圖可以被卸載,並重新加載(呼叫viewDidLoad)時進行模態駁回。

我的建議是,在設置選項卡切換和查看加載方法的一些調試斷點和檢查調用堆棧,以確保您的標籤欄控制器的整個生命週期的理解相匹配。