1

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

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:

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

我的代码是:

类 1(NSObject):

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

类 2(UIViewController):

- (void) performSegue
{
    [self performSegueWithIdentifier:@"DerinlikToPali" sender:self];
}

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

3 回答 3

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.创建方法 performegueNotification:

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

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

}
于 2013-05-16T21:47:13.643 回答
2

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

问题一定是这一行=

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 方法之前被推送到堆栈

于 2013-03-18T14:49:00.113 回答
0

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

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

更新(在查看 SampleProject 之后):

  • SampleClass *sample = [SampleClass alloc] 一般应该是“alloc init”,这样你不仅分配了内存,还完成了完整的对象初始化。
  • SampleClass methodToSegue() 不会像您预期的那样创建 ViewController 对象。首先看上面的“alloc init”,但在这种情况下你需要更多(下)。否则你将没有一个有效的 UIViewController 对象。请注意,您必须首先在 storyBoard 中为其命名,以便您可以创建它(使用该名称)。替代方法是使用 XIB 代替 storyBoard,在这种情况下,您使用 initWithNibName:bundle:

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

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

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

于 2013-03-18T14:20:03.330 回答