【问题标题】:How to switch to other view controller programmatically in Swift 4?如何在 Swift 4 中以编程方式切换到其他视图控制器?
【发布时间】:2018-02-15 03:18:06
【问题描述】:

我需要使用按钮切换页面(其他视图控制器)。 我有两个控制器(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

}()

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

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

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

然后我在函数中添加了以下内容:

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

结果没有切换到其他viewController(HomeViewController)。

关于我应该如何使它工作的任何想法?谢谢

【问题讨论】:

  • HomeViewController 的 xib 名称是什么?
  • 您确定没有在 SO 中找到已在此处询问的类似帖子吗?
  • 这是 iOS 非常基本的东西,你应该在发布问题之前在互联网上搜索它(谷歌或 youtube 甚至堆栈溢出)。

标签: ios swift


【解决方案1】:

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

  1. 导航

  2. 现在

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

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

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+Drag 从“View Controller”按钮,到第二个View Controller(HomeViewController)的某个地方。它可以在第二个视图控制器的主框中的任何位置。当您释放时,它会显示一个如下所示的框。

在此您不需要任何代码来切换,它会在单击按钮时切换。

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

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

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

不同segues的细节

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

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

自定义 - 正是它听起来的样子。您可以制作自己的 segue 样式和过渡并在此处使用。

【讨论】:

    【解决方案2】:

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

    导航流程

    首先,您需要将视图嵌入到导航控制器中,例如 -


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

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


    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)
    

    【讨论】:

      【解决方案3】:

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

      1. 出席和解雇
      2. 导航控制器

      ->第一种方法很简单

      只需要写两行:

      万一控制器在另一个故事板文件中

      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)
      

      -> 第二次使用导航控制器

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

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

      在您的情况下,您将捆绑提供为 Nil,这是错误的

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

      ///需要提供Bundle详细信息

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

      【讨论】:

        【解决方案4】:
        let HomeViewController = ViewController(nibName: "ViewController", bundle: Bundle.main)
        self.presentViewController(HomeViewController, animated: true, completion: nil)
        

        【讨论】:

        • 我将您的建议添加到函数中,它给了我一个错误说 libc++abi.dylib: terminating with uncaught exception of type NSException 我检查了我没有任何损坏的触发 segues 或任何出口被断开了。任何的想法?谢谢
        猜你喜欢
        • 1970-01-01
        • 2012-06-11
        • 2010-10-29
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        相关资源
        最近更新 更多