簡體   English   中英

在UITabbarController中設置視圖控制器的委托

[英]Set delegate of viewcontrollers in UITabbarController

我的應用程序中具有以下設置:

具有3個視圖控制器的UITabbarController,具有嵌入式UINavigationControllers。 UIViewController子類(稱為“ SVC”)中的3個viewcontroller inheret /父類,以便實現在所有3個viewcontroller中使用的元素並防止重復代碼。 在此“ SVC”類中,我設置了一個稱為“ dismissDelegate”的委托(用於告知何時tabbarcontroller被撤消)。

@protocol ModalViewDelegate <NSObject>

    - (void)didDismissModalViewFrom:(UIViewController *)viewController;

@end
   @property (weak, nonatomic) id <ModalViewDelegate> dismissDelegate;

我的另一個與UITabbarController綁定的viewcontroller實現了該委托,以便獲得有關tabbarcontroller被關閉時的信息。

SVC類將這樣的選項卡通知委托人解雇:

 [self.dismissDelegate didDismissModalViewFrom:self]; 

現在,我想將繼承自SVC類(所有選項卡式視圖控制器)的所有視圖控制器的委托設置為此視圖控制器,然后嘗試通過prepareToSegue方法執行此操作,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

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


        UITabBarController *tabBarController = segue.destinationViewController;

        for (UINavigationController *navController in  tabBarController.viewControllers) {


            for (UIViewController *vc in navController.viewControllers) {
                _SubclassVC = (SVC *) vc.superclass;
                _SubclassVC.dismissDelegate = self; 

            }

        }


    }

}

但是我收到以下錯誤:

+[SVC setDismissDelegate:]: unrecognized selector sent to class 0xbca68

我的問題:

  1. 這是解決此問題的正確方法(獲取有關解雇ViewController的信息,並將此委托設置在由多個ViewController派生的子類中)嗎?
  2. 我如何設法將我的第一個viewcontroller設置為tabbar中所有viewcontroller的委托-SVC類,以便在tabbarcontroller被放棄時可以得到通知並解決錯誤?
+[SVC setDismissDelegate:]: unrecognized selector sent to class 0xbca68

看到+

加號表示您正在調用類方法。 您必須嘗試通過設置器設置類變量。 但是屬性僅表示實例變量。 因此,自動生成的setter和getter僅為實例方法。 (從減號開始-在這樣的錯誤消息中)。

那就是你要做的:

        _SubclassVC = (SVC *) vc.superclass;
        _SubclassVC.dismissDelegate = self;

無論出於何種原因(可能是由於錯誤或誤解),您都可以使用vc實例並獲取其superclass vc.superclass返回類對象,而不是對象(在Obj-C類對象中,對象也不是實例)。 然后,將其強制轉換為(SVC *) ,以阻止編譯器拋出錯誤(或警告-不確定)。

好吧,我想您想知道自己為什么必須進行所有類型轉換。 那就是原因:)

接下來,將self分配給屬性dismissDelegate 編譯器執行此操作是因為您將其類型轉換為SVC *,后者確實具有屬性dismissDelegate 實際上,編譯器將像這樣在結構中像往常一樣調用setter setDismissDelegate

但是在運行時,消息(或選擇器)setDismissDelegate:不會發送到SVC*而是發送到class對象。 而且SVC類沒有方法(或選擇器) +setDismissDelegate: ,因此無法解析該消息。 這正是錯誤消息告訴您的內容。

好的,現在我們可以解決您的問題。 1.嗯,這不是我要做的方式,但這當然是實現它的一種方式。 2.如果您要堅持使用這種不尋常的方法,那么請進行此較小的更改,您將擺脫錯誤:

for (SVC *vc in navController.viewControllers) {
    vc.dismissDelegate = self; 
}

獲取超類對象沒有任何意義。 如果您無法訪問超類的屬性,則您對繼承鏈做錯了。 如果您想成為保存方:

for (UIViewController *vc in navController.viewControllers) {
  if (vc isKindOfClass:[SVC class]){  //BTW, this is good usage of the class object
    SVC *svc = (SVC*) vc;
    svc.dismissDelegate = self; 
  }
}

暫無
暫無

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

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