簡體   English   中英

為什么我的標簽欄控制器從活動視圖控制器之外的視圖控制器執行代碼?

[英]Why does my tabbar controller execute code from a different view controller than the active one?

首先,我將兩個視圖控制器都設置為UITabBarController委托。 兩者都是標簽欄控制器的一部分。 我通過將以下代碼放入每個viewDidLoad中來完成此操作:

self.tabBarController.delegate = self;

然后,將以下委托方法添加到CalculatorsViewController中:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
[self presentCalculatorsView];
}

presentCalculators視圖僅在同一視圖控制器中顯示一個子視圖。

我還將以下委托方法添加到OptionsViewController中:

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {

    [self presentHomeScreen];

}

同樣,此方法只是顯示viewController中的另一個子視圖。

我遇到的問題是,僅當我不訪問CalculatorsViewController時才調用OptionsViewController presentHomeScreen方法。 一旦我訪問了應用程序中的CalculatorsViewController,然后返回OptionsViewController,

[self presentHomeScreen]

從未被調用。 實際上,似乎它仍然從CalculatorsViewController調用該方法。 我用NSLog語句測試了它。

任何想法為何一種方法優先於另一種方法? 還是為什么選項卡欄按鈕從另一個viewController而不是活動的視圖控制器執行代碼?

編輯*幾乎就像一個viewController從另一個竊取了該委托。

通過調用self.tabBarController.delegate = self; 在每個viewDidLoad方法上,基本上是在告訴選項卡欄控制器使用放棄當前委托並將當前視圖控制器用作委托。

請注意,在正常情況下, viewDidLoad方法僅被調用一次。 (例如,由於內存警告而卸載視圖控制器的視圖時,可能會再次調用該視圖,然后您再次訪問視圖控制器的視圖,這將調用loadView / awakeFromNibviewDidLoad 。對此我不太確定。但在您的情況下:

  1. 第一次打開OptionsViewController-選項卡欄控制器的委托是OptionsViewController
  2. 首次打開CalculatorsViewController-標簽欄控制器的委托現在為CalculatorsViewController
  3. 返回OptionsViewController-選項卡欄控制器的委托仍然是CalculatorsViewController,因為不會再次調用viewDidLoad

如果必須更改委托,則可以改為在viewWillAppear方法中進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM