2013-03-18 151 views
1

我试图从不同类别的呼叫performSegueWithIdentifier这是NSObject类表演赛格瑞,我收到此错误:从另一个类

终止应用程序由于未捕获的异常“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

只是一个想法你检查在故事板的标识符,它是你的标识正确的拼写?我不得不改变我的评论,因为我在第一部分错了。只需检查故事板中的标识符,看看它是否是正确的。 – 2013-03-18 13:41:34

+0

是的我试图从NSObject类去viewcontroller。我试图把它放到NSObject类也没有工作。我把segue代码放在NSObject类中。 – birdcage 2013-03-18 13:45:11

+0

你是否检查过将视图控制器类连接到下一个视图的标识符?该segue标识符可能是问题。并且在你的segue方法中,Palinolojik是segue的目的地,但是在你的ns对象类中,标识符与derinlikview相关。目标视图应该是其中的一个,而不是两个。 – 2013-03-18 13:46:54

回答

2

我认为没有错,你的故事板或您的塞格斯,什么不是。当你分配你的Class2它无法找到连接到您的视图中的SEGUE一个新的视图控制器指针

问题必须是此行=

DerinlikView *derinlik = [DerinlikView alloc]; 

一个解决办法是通过您发起的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方法之前

+0

它没有触发Class2中的performSegue方法。我应该在哪里放置这段代码 - > Class1 * callNsObject = [[Class1 alloc] init]; UIViewController * currentVC = self; //这是你需要的部分传递当前viewcontrollers指向你的nsobject类的指针取决于你的项目你有多种方式做它。 callNsObject.viewController = currentVC; – birdcage 2013-03-18 15:04:30

+0

这是一个示例,当您调用您的Class1(NSObject)将Class2的当前viewcontroller指针传递给您的Class1时。你需要把它放在你打电话给你的Class1方法之前 – 2013-03-18 15:21:33

+0

最后它的工作完美..非常感谢你的帮助! – birdcage 2013-03-18 15:30:37

0

错误记说: “DerinlikToPali” 在故事板没有被发现。

转到您的故事板,选择SEGUE并检查它的属性检查器(菜单视图 - 工具 - 显示属性检查器)。确保标识符与您在performSegueWithIdentifier中使用的字符串相同。

更新(看着SampleProject后):

  • SampleClass *样品= [SampleClass页头]应该是“黄金初始化”,在一般情况下,让你不仅分配内存,而且还完成了完整的对象初始化。
  • SampleClass methodToSegue()如你预期不创建视图控制器对象。首先看到上面的“alloc init”,但在这种情况下,你需要更多(下面)。否则,你将没有一个有效的UIViewController对象。请注意,你必须先在storyBoard上给它一个名字,以便你可以创建它(使用该名称)。替代方案是使用XIB代替故事板,在这种情况下使用initWithNibName:束:

    的ViewController * VC = [[UIStoryboard storyboardWithName:@ “MainStoryboard_iPad” 束:无] instantiateViewControllerWithIdentifier:@ “的viewController”];

  • 最大的问题是逻辑的,我希望它只在这个SampleProject中:objectA被创建,创建objectB,它创建objectA并调用它的方法...除了objectA的创建再次创建objectB - >我们有一个永远循环和东西会崩溃。

不管怎么说,我更新的答案是,你对象创建未完成你试图触发SEGUE之前。特别是“ViewController”还不是在storyBoard中定义的实际UIViewController,因此没有预期的继续。

+0

我知道你的意思,但它在那里。当我从Class2中调用它时,它就可以工作。但我试图从不同的课程中调用同一个segue。这是我的问题.. – birdcage 2013-03-18 14:31:00

7

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

在NSObject类.m文件我添加:

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

在的ViewController类.m文件 -

1.In的 - (无效)viewDidLoad中我加入:

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

2.In的 - (无效)viewDidUnload我加入:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

3.Created方法performsegueNotification:

-(void)performsegueNotification:(NSNotification *) notif 
{ 

    [self performSegueWithIdentifier: @"PresentView" sender:self]; 

}