我有一个通用的UIViewController所有的uiviewscontroller都扩展了它来重用一些通用的操作。

我想在这个Common UIViewController上建立一个segue这样所有其他的UIViewController都会继承。

我想知道如何通过编程来实现。

我想这个问题也可能是我如何为我所有的uiviewcontroller设置segue而不需要进入故事板手工操作。


当前回答

我一直在使用这段代码来实例化我的自定义segue子类并以编程方式运行它。这似乎很有效。这有什么问题吗?我很困惑,看到所有其他的答案都说这是不可能的。

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

其他回答

下面是编程方式创建segue的代码示例:

class ViewController: UIViewController {
    ...
    // 1. Define the Segue
    private var commonSegue: UIStoryboardSegue!
    ...
    override func viewDidLoad() {
        ...
        // 2. Initialize the Segue
        self.commonSegue = UIStoryboardSegue(identifier: "CommonSegue", source: ..., destination: ...) {
            self.commonSegue.source.showDetailViewController(self.commonSegue.destination, sender: self)
        }
        ...
    }
    ...
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // 4. Prepare to perform the Segue
        if self.commonSegue == segue {
            ...
        }
        ...
    }
    ...
    func actionFunction() {
        // 3. Perform the Segue
        self.prepare(for: self.commonSegue, sender: self)
        self.commonSegue.perform()
    }
    ...
}

你必须将你的代码链接到你正在使用的UIStoryboard。确保你进入UIStoryboard中的YourViewController,点击它周围的边框,然后设置它的标识符字段为你在代码中调用的NSString。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                                                     bundle:nil];
YourViewController *yourViewController = 
 (YourViewController *)
  [storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerID"];
[self.navigationController pushViewController:yourViewController animated:YES];

对于故事板中的控制器。

Jhilgert00是你要找的东西吗?

-(IBAction)nav_goHome:(id)sender {
UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
[self.navigationController pushViewController: myController animated:YES];

}

还是……

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

实际上有几个问题:

首先,在你为我们上传的那个项目中,segue没有“segue1”标识符:

没有标识符

如果您还没有填写标识符,您应该填写。

第二,当你从表视图推到表视图时,你在调用initWithNibName来创建一个视图控制器。你需要使用instantiateViewControllerWithIdentifier。

故事板segue不能在故事板之外创建。尽管有一些缺点,但您需要将其连接起来。

UIStoryboardSegue Reference明确指出:

你不能直接创建segue对象。相反,是故事板 运行时必须在两个视图之间执行segue时创建它们 控制器。类型仍然可以以编程方式启动segue performSegueWithIdentifier:sender: UIViewController的方法 想要的东西。您可以这样做,以从添加的源启动一个segue 因此在接口生成器中不可用。

你仍然可以通过编程的方式告诉故事板使用presentModalViewController:或pushViewController:animated:调用的segue来呈现一个视图控制器,但是你需要一个故事板实例。

你可以调用UIStoryboards类方法来获得一个命名的故事板,它带有主bundle的nil。

情节提要名称:捆绑包: