![](/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.