繁体   English   中英

执行函数以从另一个类调用performSegueWithIdentifier

[英]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];

希望这可以帮助。

有几种方法可以实现:-

  1. 使用Delegate
  2. 使用NSNotification
  3. 上面Artur所描述的方式(仅适用于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM