![](/img/trans.png)
[英]How to set delegate of viewControllers in TabbarController?
[英]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
我的問題:
+[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.