从另一个class表演继续

我正在尝试从NSObject类的不同类调用performSegueWithIdentifier,我收到此错误:

由于未捕获exception“NSInvalidArgumentException”而终止应用程序,原因是:

'Receiver (<DerinlikView: 0x95b1ac0>) has no segue with identifier 'DerinlikToPali'' 

我的代码是:

Class1(NSObject):

  DerinlikView *derinlik = [DerinlikView alloc]; [derinlik performSegue]; 

Class2(UIViewController):

 - (void) performSegue { [self performSegueWithIdentifier:@"DerinlikToPali" sender:self]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ( [[segue identifier] isEqualToString:@"DerinlikToPali"] ) { Palinolojik *pali = segue.destinationViewController; } } 

我相信你的故事板或你的赛段没有错,什么不是。

问题必须是这条线=

 DerinlikView *derinlik = [DerinlikView alloc]; 

当你为你的Class2分配一个新的viewcontroller指针时,它找不到连接到你的视图的segue。

解决办法是将你启动的Class2的指针传递给NSObject类。

在你的class1.h中:

 @interface Class1 : NSObject { Class2 *viewController; } @property (nonatomic,strong) Class2 *viewController; 

在class1.m中

 @synthesize viewController; [self.viewController performSegue]; 

在class2.m中:

 Class1 *callNsObject= [[Class1 alloc] init]; UIViewController *currentVC=self;//this is the part you need the pass current viewcontrollers pointer to your nsobject class depends on your project thee are multiple ways of doing it. callNsObject.viewController=currentVC; 

重要的是:我不知道你的Class2视图控制器的层次结构,所以在行UIViewController *currentVC=self; 你必须改变self到你当前的视图控制器指针。

例如,如果它是一个基于导航的应用程序,您可以通过以下方式获取当前视图控制器: UIViewController *currentVC = self.navigationController.visibleViewController;

此外,我假设你的Class2的视图被推入堆栈,然后再调用您的Class1方法

我有同样的问题,我设法通过使用NSNotificationCenter解决它。

在NSObject类.m文件中我添加了:

 [[NSNotificationCenter defaultCenter] postNotificationName:@"performsegue" object:nil]; 

在ViewController类.m文件中 –

1.在 – (void)viewDidLoad中我添加了:

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performsegueNotification:) name:@"performsegue" object:nil]; 

2.在 – (void)viewDidUnload中我添加了:

 [[NSNotificationCenter defaultCenter] removeObserver:self]; 

3.创build方法执行通知通知:

 -(void)performsegueNotification:(NSNotification *) notif { [self performSegueWithIdentifier: @"PresentView" sender:self]; } 

错误提示说“DerinlikToPali”在StoryBoard中找不到。

去你的故事板,selectsegue,并检查它的属性检查器(菜单视图 – 实用程序 – 显示属性检查器)。 确保标识符与您在performSegueWithIdentifier中使用的string相同。

更新 (查看SampleProject之后):

  • SampleClass * sample = [SampleClass alloc]一般应该是“alloc init”,所以你不但要分配内存,还要完成全部对象的初始化。
  • SampleClass methodToSegue()不会像您期望的那样创buildViewController对象。 首先看到上面的“alloc init”,但在这种情况下,你需要更多(下面)。 否则,你将不会有一个有效的UIViewController对象。 请注意,你必须先在storyBoard上给它一个名字,以便你可以创build它(使用这个名字)。 另一种方法是使用XIB而不是storyBoard,在这种情况下,您使用initWithNibName:bundle:

    ViewController * vc = [[UIStoryboard storyboardWithName:@“MainStoryboard_iPad”bundle:nil] instantiateViewControllerWithIdentifier:@“viewController”];

  • 最大的问题是合乎逻辑的,我希望它只在这个SampleProject中:objectA被创build,创buildobjectB,它创buildobjectA并调用它的方法…除了objectA的创build再次创buildobjectB – >我们有一个永远的循环, 。

无论如何,我更新的答案是你的对象创build没有完成之前,你试图触发segue。 特别是“ViewController”还不是在storyBoard中定义的实际的UIViewController,因此没有预期的继续。