从另一个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,因此没有预期的继续。