如何在Swift 4中以编程方式切换到其他视图控制器?

时间:2018-02-15 03:18:06

标签: ios swift

我需要使用按钮切换页面(其他视图控制器)。 我有两个控制器(viewController到HomeViewController) 我在viewController中创建了一个按钮:

let acceptButton: UIButton = {
    let button = UIButton(type: .system)
    button.setTitle("Accept", for: .normal)
    button.setTitleColor(.blue, for: .normal)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18)
    button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
    //button.sendAction(Selector(buttonAction), to: HomeViewController(), for: .touchUpInside)

    return button

}()

我已经设置了一个函数并使用了print语句来测试函数:

 @objc func buttonAction(sender: UIButton){
 print("button pressed")
}

我执行了程序,当我按下按钮时,它会打印出“按下按钮”

然后我将以下内容添加到函数中:

  let HomeViewController = ViewController(nibName: ViewController, bundle: nil)
  self.presentViewController(HomeViewController, animated: true, completion: nil)

因此,它不会切换到其他viewController(HomeViewController)。

我应该如何让它有效?谢谢

4 个答案:

答案 0 :(得分:4)

切换 到另一个 viewController 以编程方式 Swift 4 -

导航过程

首先,您需要使用导航控制器(例如

)嵌入视图

enter image description here

对于以编程方式导航,您可以使用以下代码 -

  • 但是如果您在项目中使用StoryBoard,则此代码可以使用。 首先,您需要在storyBoard中设置视图标识符

enter image description here

Push with StoryBoard

let homeView = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
self.navigationController?.pushViewController(homeView, animated: true)

Present with StoryBoard

let homeView = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
present(homeView, animated: true, completion: nil)

Push with XIB

let homeView = HomeViewController(nibName: "HomeViewController", bundle: nil)
self.navigationController?.pushViewController(homeView, animated: true)

Present with XIB

let homeView = HomeViewController(nibName: "HomeViewController", bundle: nil)
present(homeView, animated: true, completion: nil)

为了避免任何崩溃,您也可以尝试使用此代码 -

guard let homeView = HomeViewController(nibName: "HomeViewController", bundle: nil) else {
   print("Controller not available")
   return
}
self.navigationController?.pushViewController(homeView, animated: true)

答案 1 :(得分:3)

有几种方法可以切换到另一个ViewController。

  1. 导航

  2. 当前

  3. 如果您已在故事板中创建了控制器,则必须首先获取故事板的实例以防多个故事板。

    如果是多个故事板,您需要提及故事板的名称。

    let sampleStoryBoard : UIStoryboard = UIStoryboard(name: "UserBoard", bundle:nil)
    

    然后获取要切换的视图控制器的实例。

    *确保在ViewController中设置正确的标识符。

    let homeView  = sampleStoryBoard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
    

    如果您想呈现视图控制器:

    self.present(homeView, animated: true, completion: nil)
    

    如果您想推送视图控制器:

    self.navigationController?.pushViewController(homeView, animated: true)
    

    如果您要切换到另一个您创建为Xib的控制器

    let homeView = HomeViewController(nibName: "HomeViewController", bundle: nil)
    

    如果您想推送:

    self.navigationController?.pushViewController(homeView, animated: true)
    

    呈现控制器:

    present(homeView, animated: true, completion: nil)
    

    在控制器之间切换的其他方法。

    连接Segues

    Ctrl +从“视图控制器”按钮拖动到第二个视图控制器(HomeViewController)中的某个位置。它可以位于第二个视图控制器的主框中的任何位置。当你发布时,它会显示一个类似下面的框。

    enter image description here

    在此您不需要切换任何代码,只需点击一下按钮即可开启。

    或者您可以CTLR +从View控制器拖动到其他控制器以创建segue并在单击按钮操作时写下代码并切换到另一个视图控制器。

    performSegue(withIdentifier:" mySegueID",sender:nil)

    确保您设置了正确的segue标识符。

    不同细分的细节

    显示 - 当视图控制器位于UINavigationController中时,会将下一个视图控制器推送到导航堆栈。这允许用户单击后退按钮,通过导航栏左上角的后退按钮返回上一屏幕。

    以模态方式呈现 - 这将在当前视图控制器上以模态方式呈现下一个视图控制器。这个不需要是UINavigationController或UISplitViewController的一部分。它只是在前一个视图控制器前面显示目标视图控制器。这通常在用户必须完成或取消时使用。

    自定义 - 完全是听起来像什么。你可以制作自己的segue风格和过渡,并在这里使用它。

答案 2 :(得分:1)

您可以通过两种方式切换到控制器

  1. 出席和解雇
  2. 导航控制器
  3. <强> - &GT;第一种方法很简单

    只需要写两行:

    如果控制器位于另一个故事板文件中

    let newStoryBoard : UIStoryboard = UIStoryboard(name: "UserBoard", bundle:nil)
    let VC = newStoryBoard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
    self.present(VC, animated: true, completion: nil)
    

    或者如果在同一个故事板中

    let VC = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
    self.present(VC, animated: true, completion: nil)
    

    <强> - &GT;第二个使用导航控制器

    只需使用导航控制器,然后在导航堆栈中推送或弹出控制器

    let VC = self.storyboard?.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
    self.navigationController?.pushViewController(VC, animated: true)
    

    在您的情况下,您提供的套餐为Nil,这是错误的

    let HomeViewController = ViewController(nibName: ViewController, bundle: nil)
    

    ///需要提供捆绑详情

    let HomeViewController = ViewController(nibName: ViewController, bundle: Bundle.main)
    

答案 3 :(得分:0)

let HomeViewController = ViewController(nibName: "ViewController", bundle: Bundle.main)
self.presentViewController(HomeViewController, animated: true, completion: nil)