Ios 在目标c中使用类层次结构时,如何从超类调用子类方法

Ios 在目标c中使用类层次结构时,如何从超类调用子类方法,ios,objective-c,cocoa-touch,protocols,Ios,Objective C,Cocoa Touch,Protocols,这是我的代码: @interface RootViewController : UIViewController{ } -(IBAction)btnDetail1_Clicked:(id)sender; @end @implementation RootViewController -(IBAction)btnDetail1_Clicked:(id)sender{ DetailViewController1 *mvcr = [[DetailViewController1 all

这是我的代码:

@interface RootViewController : UIViewController{

}
-(IBAction)btnDetail1_Clicked:(id)sender;
@end



@implementation RootViewController

-(IBAction)btnDetail1_Clicked:(id)sender{
    DetailViewController1 *mvcr = [[DetailViewController1 alloc] initWithNibName:@"DetailViewController1" bundle:nil];
    [mvcr setDelegate:self];
    [self.navigationController pushViewController:mvcr animated:YES];
    [mvcr release];
}
@end



@protocol NotifySubclass
@optional
-(void) serviceCall_done;
@end

@interface MasterViewController : UIViewController{
     id<NotifySubclass> delegate;
}
@property (retain) id delegate;
-(void) initCallService;
@end




@implementation MasterViewController
@synthesize delegate;

-(void) initCallService{
    "My some other code is here."
    [self performSelector:@selector(startLoading) withObject:nil afterDelay:5];
}

-(void) startLoading{
    "My some other code is here."
    [self performSelectorOnMainThread:@selector(loadComplete) withObject:nil waitUntilDone:YES];
}

-(void) loadComplete{
    "I want to call DetailViewController1's "serviceCall_done" method from here.
     [delegate serviceCall_done];
}
@end



@interface DetailViewController1 : MasterViewController <NotifySubclass>{

}
@end




@implementation DetailViewController1
- (void)viewDidLoad{
    [self initCallService];
}

-(void) serviceCall_done{

}
@end
@接口RootViewController:UIViewController{
}
-(iAction)btnDetail1_单击:(id)发件人;
@结束
@RootViewController的实现
-(iAction)btnDetail1\u已单击:(id)发件人{
DetailViewController1*mvcr=[[DetailViewController1 alloc]initWithNibName:@“DetailViewController1”bundle:nil];
[mvcr setDelegate:self];
[self.navigationController pushViewController:mvcr动画:是];
[mvcr发布];
}
@结束
@协议子类
@可选的
-(无效)服务呼叫完成;
@结束
@界面MasterViewController:UIViewController{
id代表;
}
@属性(保留)id委托;
-(无效)初始服务;
@结束
@主视图控制器的实现
@综合代表;
-(void)initCallService{
“我的一些其他代码在这里。”
[自执行选择器:@选择器(惊人加载),对象:零延时:5];
}
-(空)惊人的{
“我的一些其他代码在这里。”
[self-performSelectorOnMainThread:@selector(loadComplete)with object:nil waitUntilDone:YES];
}
-(无效)加载完成{
我想从这里调用DetailViewController1的“serviceCall\u done”方法。
[代理服务呼叫完成];
}
@结束
@界面详细信息ViewController 1:MasterViewController{
}
@结束
@实现细节视图控制器1
-(无效)viewDidLoad{
[自助服务];
}
-(无效)服务呼叫完成{
}
@结束
我想从
LoadCompetite
主视图控制器的
方法调用
DetailViewController1
serviceCall\u done
方法

我曾尝试创建协议,但在从
RootViewController
调用
DetailViewController1
时,没有找到编写协议的确切位置


有人能为我提供这方面的指导吗?

您可以使用NSNotificationCenter发布此通知,并在所有3个详细信息类中添加观察者。阅读一些有关NSNotificationCenter的教程

这里有一些教程


MasterViewController

-(void) serviceCall_done{
    //in this method you do nothing.
}
修改

-(void) loadComplete{
    [self serviceCall_done];
}
然后,在
DetailViewController1
中覆盖此方法
serviceCall\u done

-(void) serviceCall_done{
    //Add code
}

通过谈论通知“子类”和“超类”,您混淆了您的问题(和代码)“。这个问题与类继承没有任何关系;您只需要在主控制器中引用详细控制器。是否有某个对象知道这两个方面,可能是您的根视图控制器?@jrturton我有多个detailviewcontroller,如DetailViewController1、DetailViewController2、DetailViewController3等。它们都是MasterViewController的子类。通知哪个detailviewcontroller我将管理,但如何通知我正在询问。你能详细解释一下吗?我希望苹果公司能对单词
retain
delegate
作为单个表达式的一部分发出警告。@a-Live,我想如果编译器能发出警告就足够了。我不希望苹果打电话给我:)谢谢拉胡尔·维亚斯的回答。这对我有帮助。