从另一个班级表演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的主要内容,如果未能解决你的问题,请参考以下文章