我试图从NSObject类的不同类调用performSegueWithIdentifier,我收到此错误:
由于未捕获的异常'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;
}
}
答案 0 :(得分:7)
我遇到了同样的问题,我设法通过使用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.处理方法performsegueNotification:
-(void)performsegueNotification:(NSNotification *) notif
{
[self performSegueWithIdentifier: @"PresentView" sender:self];
}
答案 1 :(得分:2)
我认为你的故事板或你的故事并没有错,什么不是。
问题必须是这一行=
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 viewcontroller的层次结构,所以在行UIViewController *currentVC=self;
中你必须将self
更改为当前的视图控制器指针。
例如,如果它是基于导航的应用程序,您可以通过以下方式获取当前视图控制器:
UIViewController *currentVC = self.navigationController.visibleViewController;
此外,我假设您在调用Class1方法之前将Class2的视图推送到堆栈
答案 2 :(得分:0)
错误说明&#34; DerinlikToPali&#34;在StoryBoard中找不到。
转到storyBoard,选择segue并检查它的属性检查器(菜单视图 - 实用程序 - 显示属性检查器)。确保标识符与您在performSegueWithIdentifier中使用的字符串相同。
更新(查看SampleProject后):
SampleClass methodToSegue()没有按预期创建ViewController对象。首先看上面&#34;分配init&#34;,但在这种情况下你需要更多(下面)。否则,您将没有有效的UIViewController对象。请注意,您必须首先在storyBoard中为其命名,以便您可以创建它(使用该名称)。替代方法是使用XIB而不是storyBoard,在这种情况下,您使用initWithNibName:bundle:
ViewController * vc = [[UIStoryboard storyboardWithName:@&#34; MainStoryboard_iPad&#34; bundle:nil] instantiateViewControllerWithIdentifier:@&#34; viewController&#34;];
最大的问题是合乎逻辑的,我希望它只在这个SampleProject中:objectA被创建,创建objectB,它创建objectA并调用它的方法......除了objectA创建创建objectB再次 - &gt;我们有一个永远的循环,有些东西会崩溃。
无论如何,在您尝试触发segue之前,我更新的答案是您的对象创建未完成。特别是&#34; ViewController&#34;还不是在storyBoard中定义的实际UIViewController,因此没有预期的segue。