从另一个类执行segue

时间:2013-03-18 13:36:01

标签: ios xcode segue

我试图从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;
    }
}

3 个答案:

答案 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 * sample = [SampleClass alloc]应该是&#34; alloc init&#34;一般来说,所以你不仅要分配内存,还要完成整个对象的初始化。
  • 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。