使用带有分段控制的 Storyboard Segue

Posted

技术标签:

【中文标题】使用带有分段控制的 Storyboard Segue【英文标题】:Using Storyboard Segues with Segmented Control 【发布时间】:2014-09-10 15:34:54 【问题描述】:

我有一个分段控件,用于在三个视图控制器之间切换。我的第一个 tableview 嵌入在导航控制器中,分段控件位于导航控制器中。我在情节提要中还有两个自定义转场(动画来自左侧和右侧)。在我的“主”控制器类——分段控制的中间——我使用这段代码

- (IBAction)indexChanged:(id)sender 
    if ([sender selectedSegmentIndex] == 0) 
        [self performSegueWithIdentifier:@"leftSegue" sender:self];
    
    else if ([sender selectedSegmentIndex] == 1)
    
    else 
        [self performSegueWithIdentifier:@"rightSegue" sender:self];
    

这对这两个控制器非常有用。当这些视图控制器放在屏幕上时,我仍然可以在最左边和最右边的控制器之间移动,但是在我尝试过的每次尝试下,回到主控制器都会崩溃。我认为这与我不了解我正在发送performSegueWithIdentifier 消息的self 或我传递给sender:self 有关。

示例:如果在else if ([sender selectedSegmentIndex] == 1) 中创建一个新的segue,其唯一标识符来自两个新控制器中的任何一个,当拼写正确时,应用程序会崩溃并显示“Receiver has no segue with identifier”。本例中的接收者是谁?

编辑:我在此处添加了我当前的故事板图片。前两个是自定义segue,中间两个是modal和push,具体针对需求。

Edit2:使用 self.navigationController.viewControllers[0] 之类的方法可以找到正确的视图,但它不允许我切换回初始控制器 - 它会重新绘制它并丢失导航栏。

【问题讨论】:

【参考方案1】:

在 Xcode 中,在“Breakpoint Navigator”视图中添加一个“Exception Breakpoint”。 启动您的应用程序,并尝试减少崩溃。 Xcode 现在应该在导致崩溃的指令上停止。 所以现在当你停下来的时候,试着在调试区输入po self,来得到哪些类是接收者,它可能会帮助你理解发生了什么......

【讨论】:

【参考方案2】:

objective-C 中的self 相当于大多数其他语言(java、php 等)中的this

表示当前的班级。

MainViewController 说如果你这样做:

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

和这个一样

[MainViewController performSegueWithIdentifier:@"leftSegue" sender:self];

【讨论】:

谢谢。所以使用这种方法我认为不可能再次呈现中间视图控制器,因为我不能对“自我”有一个segue - 它需要呈现其他东西? 如 - 我认为没有方法 segueToSelf 或执行类似的方法。 您能详细说明您要达到的目标吗?我不明白为什么你的 viewController 需要自我定位 我的主窗口嵌入在导航控制器中。在导航栏中,有一个在三个视图之间翻转的分段控件。它可以在第一个视图和第三个视图之间切换,但要更改的第二个视图是显示的主视图。如何表示我想返回主视图? 好的我明白你的意思了,只使用分段控制器的segue,使用[self.navigationController popViewControllerAnimated:TRUE]; 弹回主控制器【参考方案3】:

您从当前所在的视图控制器到主视图控制器的 segue 可能没有正确标记为“rightSegue”(或其他任何名称)。

在选择 Storyboard segue 时,在 Xcode 的右侧面板上,检查“标识符”字段的标签是否正确。

【讨论】:

标签正确。错误必须来自 IBAction 内部-self 是我要显示的视图控制器。我不应该继续使用弹出框或类似方法吗? 我的理解是你从中间部分开始你的观点(我们称之为VC2)。然后移动到 VC1 或 VC3。当你通过分段控件回到VC2时,这就是错误发生的地方? 是的,完全正确。我现在知道发生错误是因为分段控制操作发生在 VC2 中 - 排序的主要视图。没有一种简单的方法可以继续“自我”。也许我会在两者之间放置一个清晰的视图并使用它来导航。理想情况下,如果我在 VC3 中按 VC1,我希望显示 VC2 0.5 秒并立即继续显示 VC1。 看起来@meda 回答了你原来的问题。关于自定义动画,您可能希望查看以下link 中接受的答案,以获取有关通过动画块自定义动画的示例代码。

以上是关于使用带有分段控制的 Storyboard Segue的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 - PopOver 中的 UITableViewController 可以找到带有错误的 segue Receiver(UITableViewController) has no segu

iOS如何获取对带有segue的storyboard容器中嵌入的视图控制器的引用?

UIScrollView 在从不同的视图控制器 segu 时具有不同的 y 位置

在带有分段控件的 UITabBarController 中模态显示导航视图控制器

如何更改不同分段控制索引的数据源

带有 StoryBoard 菜单项的 MMDrawerController