如何创建从视图控制器到自身的 segue

Posted

技术标签:

【中文标题】如何创建从视图控制器到自身的 segue【英文标题】:how create a segue from view controller to itself 【发布时间】:2015-07-27 07:58:18 【问题描述】:

我的应用有类别,而这个类别可以有无限的子类别或视频。我的主要视图控制器有一个 uicollection vith 单元格。我需要这样,当我选择一个类别时,如果该类别有子类别,那么首先创建其他视图控制器,但如果该类别有视频,则转到其他不同的视图控制器。

我认为我的主视图控制器中的单元格需要两个 segues:

其中一个具有显示视频视图控制器的目的地 other go it self to show all the subcategories.

我想将一个 segue 从我的 voew 控制器的单元格中拖到其自身。所以我可以推送那个特定视图控制器的“无限”实例(对于所有可能的子类别)。

但我不知道如何将 segue 从视图控制器拖到自身。当我尝试拖动第二个 segue 时,xcode 删除了我的第一个 segue。

谢谢你的朋友。

【问题讨论】:

您应该在代码中创建视图控制器并在您的代码中显示/推送它,而不是创建segue。 我不需要转场?当转场时,在我的 prepareforsegue 函数中? 你昨天不是也问过同样的问题吗?见:***.com/questions/31640508/… 请不要问两次。我们都有一些没有答案的问题。尊重他人,你不是唯一一个要求的人。 【参考方案1】:

只需从代码中创建自定义 segue。这样您就不会仅限于使用情节提要时的一种转场。

 UIViewController *toViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"OtherViewControllerId"];
 MyCustomSegue *segue = [[MyCustomSegue alloc] initWithIdentifier:@"" source:self destination:toViewController];
 [self prepareForSegue:segue sender:sender];
 [segue perform];

或者创建一个带有 ID 的视图控制器并推送它

UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyController"];
[self.navigationController pushViewController: myController animated:YES];

【讨论】:

如何在 Swift 中做到这一点?【参考方案2】:

这是基于@MaciekWrocław 的 Swift 答案

let destinationViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DestinationViewController")

let segue = UIStoryboardSegue(identifier: "SegueToProfileViewController",
                                      source: self,
                                      destination: anotherProfileVC,
                                      performHandler: 
                                                self.navigationController?.show(anotherProfileVC, sender: self)
        )

        self.prepare(for: segue, sender: user)
sege.perform()

【讨论】:

【参考方案3】:

斯威夫特 4:

首先,在代码库中的某处的 UIViewController 上添加此类扩展:

extension UIViewController 
    class func storyboardInstance(storyboardId: String, restorationId: String) -> UIViewController 
        let storyboard = UIStoryboard(name: storyboardId, bundle: nil)
        return storyboard.instantiateViewController(withIdentifier: restorationId)
    

然后实例化 YourViewController 类的一个实例(使用上面的扩展),并从您的 navigationController 推送到它:

let destinationVC = YourViewController.storyboardInstance(storyboardId: "YourStoryboardName", restorationId: "idYouSetInStoryboard") as! YourViewController
self.navigationController?.pushViewController(destinationVC, animated: true)

【讨论】:

别忘了嵌入导航控制器【参考方案4】:

您需要删除segue并添加代码以创建VC并在didSelectRowAtIndexPath中点击单元格时推送它:

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!)

    // Create your view controller and push it
    // pass data if needed
    self.navigationController.pushViewController(yourViewController, animated: YES);

【讨论】:

以上是关于如何创建从视图控制器到自身的 segue的主要内容,如果未能解决你的问题,请参考以下文章

集合视图将 segue 推向自身

如何从自定义集合视图单元(使用 xib 创建的单元)到 tabBar 控制器创建自定义 segue

ios 如何从单视图 Segue 到拆分视图控制器

将 segue 从一个视图控制器重定向到另一个视图控制器

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

按下页面时执行 Segue