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

9

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

我执行了这个程序,当我按下按钮时,它会打印出 "button pressed"。

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

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

结果是,它不会切换到其他视图控制器(HomeViewController)。

有什么想法可以让它工作吗?谢谢


HomeViewController的XIB文件名是什么? - jignesh Vadadoriya
1
你确定你没有在SO中找到已经提出的类似帖子吗? - Bista
这是iOS非常基础的内容,你应该在提问之前先在互联网上搜索一下(谷歌、YouTube甚至是Stack Overflow)。 - Umair Afzal
4个回答

15

有几种方法可以切换到另一个视图控制器。

  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)

其他切换控制器的方法。

接线传送门

从“视图控制器”按钮Ctrl+拖拽到第二个视图控制器(HomeViewController)的任何位置。它可以在第二个视图控制器的主框中的任何位置。当您释放时,它会显示一个像下面这样的框:

enter image description here

在此过程中,您不需要任何代码来进行切换,只需单击按钮即可进行切换。

或者您可以从视图控制器CTL+拖动到其他控制器以创建传送门,并在单击按钮动作并切换到另一个视图控制器时编写以下代码:

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

确保设置了正确的传送门标识符。

不同传送门的详细信息

Show - 当视图控制器位于UINavigationController中时,这将把下一个视图控制器推入导航堆栈。这允许用户通过导航栏左上角的返回按钮返回到前一个屏幕。

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

Custom - 正是它听起来的样子。您可以创建自己的传送门样式和过渡效果,并在此处使用它。


5

Swift 4: 在程序中以编程方式切换到另一个视图控制器 -

导航过程

首先,您需要像这样嵌入带有 Navigation Controller 的视图 -

enter image description here


要进行编程导航,您可以使用以下代码 -

  • 但是此代码适用于您在项目中使用 StoryBoard 的情况下。 首先,您需要在 storyBoard 中设置视图标识符

enter image description here


使用 StoryBoard 进行 Push

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

使用故事板呈现

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

使用XIB进行推送

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

使用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

您可以用两种方法切换到控制器

  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)

0
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我检查了一下,没有任何损坏的触发segue或未连接的outlet。有什么想法吗?谢谢。 - JK5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接