![](/img/trans.png)
[英]Is it possible to call a performSegueWithIdentifier from another class?
[英]Execute function to call performSegueWithIdentifier from another class
我已经花了几个小时试图自己解决这个问题,但是我放弃了!
我有一个主从布局,其中用户输入屏幕需要调用另一个类上的函数以发布到Web服务。 异步调用完成后,该类将调用指定的函数。 在这种情况下,我只是测试,我要做的就是在Web服务接受用户输入后返回主屏幕。
当用户点击输入屏幕上的按钮(SetLocationViewController)时,将在APIPostClass类中调用异步操作。 完成后,我想让SetLocationViewController选回到MasterViewController。
在APIPostClass.m中(在异步操作完成后调用)
-(void)callWhenDone {
NSLog(@"callWhenDone loaded.");
SetLocationViewController *SLVClassInstance = [[SetLocationViewController alloc] init];
[SLVClassInstance doSegue];
}
在SetLocationViewController.m中
-(void) doSegue {
NSLog(@"doSegue loaded");
[self performSegueWithIdentifier:@"SetLocationViewControllerManualUnwind" sender:self];
}
从SetLocationViewController.m上的操作调用doSegue确实可以,所以我知道我的命令是可以的,但是以上方法不起作用。 我收到错误原因:'Receiver()与标识符'SetLocationViewControllerManualUnwind'没有关联
我猜测原因是由于VC初始化的alloc init方式,但是我不知道有什么更好的方法。 因此,如何在另一个类上调用函数,就像它是由自己的类调用一样?
创建一个委托,它将比通知更加可靠和快捷。
@protocol APIPostDelegate <NSObject>
@required
-(void)OnRequestSucess;
@end
在您的APIPost中添加代表的新属性
@interface APIPost : NSObject
@property (weak) id<APIPostDelegate> delegate;
在SetLocationViewController中实现APIPostDelegate
SetLocationViewController.h
SetLocationViewController :NSObject<APIPostDelegate>
SetLocationViewController.m
-(void)OnRequestSucess
{
[self doSegue];
}
在APIPost上调用方法之前,请将self分配给委托属性。
APIPost *apipost=[[APIPost alloc]init];
apipost.delegate=self;
[apipost <your api method>];
APIPost.m
[self.delegate OnRequestSucess];
希望这可以帮助。
有几种方法可以实现:-
Delegate
NSNotification
。 SplitViewController
-iPad) 您应该尽可能使用委托,但可能不会太直接。 NSNotification
更直接,但这不是一个好习惯,也不是一个好的编程风格。
我将只分享NSNotification方法,因为它更易于实现。
在SetLocationViewController.m中
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSegue) name:@"calldoSegue" object:nil];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"calldoSegue" object:nil];
}
-(void) doSegue {
NSLog(@"doSegue loaded");
[self performSegueWithIdentifier:@"SetLocationViewControllerManualUnwind" sender:self];
}
在APIPostClass.m中
-(void)callWhenDone {
NSLog(@"callWhenDone loaded.");
[[NSNotificationCenter defaultCenter]postNotificationName:@"calldoSegue" object:nil];
}
上面的代码应该可以正常工作,但这不是一个好习惯。 您应该尝试学习Delegate方法。
答案就在这里: 从另一堂课开始表演
在我的APIPostClass.h中,我设置了视图控制器:
@interface APIPostClass : NSObject {
SetLocationViewController *setLocationViewController;
}
@property(nonatomic, strong) SetLocationViewController *setLocationViewController;
@end
在我的APIPostClass.m中,我将其合成:
@synthesize setLocationViewController;
然后,代替这个(就像我的问题一样):
-(void)callWhenDone {
NSLog(@"callWhenDone loaded.");
SetLocationViewController *SLVClassInstance = [[SetLocationViewController alloc] init];
[SLVClassInstance doSegue];
}
我有:
-(void)callWhenDone {
NSLog(@"callWhenDone loaded");
[self.setLocationViewController doSegue];
}
在SetLocationViewController.m中,segue方法保持不变:
-(void) doSegue {
NSLog(@"doSegue loaded");
[self performSegueWithIdentifier:@"SetLocationViewControllerManualUnwind" sender:self];
}
但是,当我调用我的API时,我需要“附加”(原谅我的术语)视图控制器。 这就是我所拥有的:
- (IBAction)btnTestAPICall:(id)sender {
NSLog(@"User tapped API button");
APIPostClass *APIPostClassInstance = [[APIPostClass alloc] init];
[APIPostClassInstance APICall: ... ....
}
但这是在满足以上所有条件后起作用的:
- (IBAction)btnTestAPICall:(id)sender {
NSLog(@"User tapped API button");
APIPostClass *APIPostClassInstance= [[APIPostClass alloc] init];
UIViewController *currentVC=self;
APIPostClassInstance.setLocationViewController = currentVC;
[APIPostClassInstance APICall: ... ...
我希望这会帮助别人!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.