繁体   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