从另一个班级表演segue

Posted

技术标签:

【中文标题】从另一个班级表演segue【英文标题】:Performing segue from another class 【发布时间】:2013-03-18 13:36:00 【问题描述】:

我正在尝试从不同的类(即 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;
    

【问题讨论】:

只是想一想,您检查了故事板中的标识符,它是您标识符的正确拼写吗?我不得不改变我的评论,因为我在第一部分错了。只需检查故事板中的标识符,看看它是否正确。 是的,我试图从 NSObject 类转到 viewcontroller。我也尝试将它放在 NSObject 类中,但没有用。我将 segue 代码原样放在 NSObject 类中。 你检查了将视图控制器类连接到下一个视图的标识符吗? segue 标识符可能是问题所在。而且在您的转场方法中,Palinolojik 是转场目的地,但在您的 ns 对象类中,标识符与 derinlikview 相关。目标视图应该是其中之一,而不是两者。 DerinlikView 是 Class2 的名称。我检查了连接。他们很好。如果我从 Class2 调用它可以工作,但我需要从 NSObject 类执行 segue。实际上,我正在寻找一种解决方案,可以让我从 NSObject 类执行 segue。我的意思是从 Class2 到 Palinolojik。 所以你是说当你在 Class2 中调用 [self performSegue] 时,它会执行 segue,但是当你从另一个类(例如 [derinlik performSegue])调用相同的方法时,它会显示 has no segue with identifier 'DerinlikToPali' 【参考方案1】:

我遇到了同样的问题,我设法通过使用 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];


【讨论】:

【参考方案2】:

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

问题一定是这一行=

DerinlikView *derinlik = [DerinlikView alloc];

当您为 Class2 分配新的视图控制器指针时,它无法找到连接到您的视图的 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 方法之前被推送到堆栈

【讨论】:

它没有触发 Class2 中的 performSegue 方法。我应该把这段代码放在哪里 --> Class1 *callNsObject= [[Class1 alloc] init]; UIViewController *currentVC=self;//这是您需要将当前视图控制器指针传递给您的 nsobject 类的部分,这取决于您的项目,您有多种方法可以做到这一点。 callNsObject.viewController=currentVC; 这是一个示例,当您调用 Class1 (NSObject) 时,将 Class2 的当前视图控制器指针传递给 Class1。您需要在调用 Class1 方法之前放置它【参考方案3】:

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

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

更新(查看 SampleProject 后):

SampleClass *sample = [SampleClass alloc] 一般应该是“alloc init”,这样你不仅分配了内存,还完成了完整的对象初始化。

SampleClass methodToSegue() 不会像您预期的那样创建 ViewController 对象。首先看上面的“alloc init”,但在这种情况下你需要更多(下)。否则你将没有一个有效的 UIViewController 对象。请注意,您必须首先在 storyBoard 中为其命名,以便您可以创建它(使用该名称)。另一种方法是使用 XIB 代替 storyBoard,在这种情况下你使用 initWithNibName:bundle:

视图控制器 *vc = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil] instantiateViewControllerWithIdentifier:@"viewController"];

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

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

【讨论】:

我知道你的意思,但它在那里。当我从 Class2 调用它时,它可以工作。但我试图从不同的班级调用相同的 segue。这是我的问题..

以上是关于从另一个班级表演segue的主要内容,如果未能解决你的问题,请参考以下文章

segue 后填充 textfield.text

大话设计模式之简单工厂读后感

[APIO2016]烟火表演

赛艇表演 51nod提高组模拟试题

[可并堆] Bzoj P4585 烟火表演

进一步解读!《网络表演(直播)内容百不宜》发布的背后