以编程方式切换到下一个视图控制器

6
我想知道如何创建一个函数,以编码/程序方式在点击登录按钮后移动到登录页面。
这是我的代码:
final class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let loginButton = UIButton(frame: CGRectMake(20, 640, 175, 75))
        loginButton.setTitle("Login", forState: UIControlState.Normal)
        loginButton.backgroundColor = UIColor.init(red: 255, green: 215, blue: 0, alpha: 0.8)
        loginButton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal)
        loginButton.titleLabel!.font = UIFont(name: "StarJediSpecialEdition", size: 30)
        loginButton.addTarget(self,
                              action: #selector(ViewController.tapActionButton),
                              forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(loginButton)
    }

    func tapActionButton(sender:UIButton!) {
        print("Button is working")
    }
}

2
你可能正在寻找performseguewithidentifier。请参考以下链接:https://dev59.com/BlwY5IYBdhLWcg3wuZym - Leo Dabus
如果他是初学者,最好使用self.presentViewController,因为segues需要额外的信息以及关于storyboards和segues如何配合工作的学习。 - Zaporozhchenko Oleksandr
2个回答

14

有多种方法可以创建您的登录页UIViewController:

  1. 您可以从xib创建,例如,您可以从此类继承控制器:
class XibLoadedVC: UIViewController {
        required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
        required init() {
            print("init \(type(of: self))")
            let bundle = Bundle(for: type(of: self))
            super.init(nibName: String(describing: type(of: self)), bundle: bundle)
        }
    }

或者只是

let controller = LoginPageViewController(nibName: "LoginPageViewController", bundle: nil)

从故事板(Storyboard)开始:
let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let loginPage = storyboard.instantiateViewControllerWithIdentifier("LoginPageViewController") as! LoginPageViewController

有多种方法可以根据您创建控制器的方式来显示它:

  1. 您可以只使用以下方式呈现控制器:
func tapActionButton(sender: UIButton!) {
    let loginPage = LoginPageViewController()
    self.present(loginPage, animated: true)
}
  1. 使用navigationController进行编程推送:
navigationController?.pushViewController(loginPage, animated: true)

需要UINavigationController的支持。因为您无法确定控制器是否在导航控制器堆栈内,所以有可选的 navigationController? 选项,以避免崩溃 :)

3.故事板和Segues:

在您的ViewController和LoginPageViewController之间创建segue。 给你的segue一个标识符和演示风格。 对于这种情况,它将是 ShowExample

现在在您的ViewController中覆盖以下方法

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
   if segue.identifier == "YourSegueIdentifier"
       let loginPage = segue.destinationViewController as! LoginPageViewController
   }
}

在登录按钮触发事件中:

func tapActionButton(sender: UIButton!) {
    performSegueWithIdentifier("YourSegueIdentifier", sender: nil)
}

操作已完成。

另外,还有一种现代化的SwiftUI方法可以完成这一切,您可以查看教程和官方文档。


你的回答非常详细,但我是一个初学者,所以请问您应该把代码放在哪里,因为总是会出现错误,告诉我要呈现的下一个视图控制器的名称未声明。谢谢! - Limyandi Vico Trico
代码应该放在LoginViewController中。从错误来看,我认为您还没有声明下一个viewController。 - Aks
我应该在何时选择上述任何选项? - Amjad Husseini
两种方法都是完全有效的,可以得到相同的结果,这取决于开发者选择哪一个。 - Aks

5
你需要创建下一个视图控制器的实例,然后使用present或push将其呈现出来。
要进行模态呈现:
self.presentViewController(nextVC, animated: true, completion: nil)

或者推送:

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

所有涉及到转场的东西都适用于故事板

干杯!


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