【问题标题】:move to next view controller programmatically以编程方式移动到下一个视图控制器
【发布时间】:2016-09-06 02:28:32
【问题描述】:

我想知道如何使用代码/编程方式创建一个单击登录按钮后移动到登录页面的功能。

这是我的代码:

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")
    }
}

【问题讨论】:

  • 您可能正在寻找 performeguewithidentifier stackoverflow.com/questions/32292600/…
  • 如果他是初学者,他最好寻找 self.presentViewController,因为 segues 需要额外的信息并了解故事板以及所有这些如何与 segues 一起工作。

标签: swift uibutton


【解决方案1】:

创建登录页面 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)
  1. 来自故事板:
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? 以不破坏应用程序:)

  1. 故事板和转场:

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

现在在你的 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 方法可以完成所有这些操作,您可以查看教程和官方文档。

【讨论】:

  • 你的回答其实很详细,但我是初学者,请问我应该把代码放在哪里,因为总是有错误告诉我我想要的视图控制器的名称to present next 是未声明的。谢谢!
  • 代码应该放在LoginViewController中。从错误中我认为你还没有声明你的下一个 viewController。
  • 我什么时候应该选择上面提到的任何选项?
  • 这两种方式都是完全有效的,并且给你相同的结果,开发者可以选择遵循哪一种。
【解决方案2】:

您需要创建下一个视图控制器的实例,然后呈现或推送该视图控制器

模态呈现:

self.presentViewController(nextVC, animated: true, completion: nil)

或推:

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

所有带有转场的东西都适用于故事板

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 2012-11-25
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多