【问题标题】:how to programmatically perform segue, or present view, when button pressed in swift3在swift3中按下按钮时如何以编程方式执行segue或呈现视图
【发布时间】:2018-04-11 23:04:34
【问题描述】:

我正在以编程方式编写应用程序(没有情节提要)并且有登录屏幕。登录屏幕具有用于登录的用户详细信息的输入框以及登录和注册按钮。

我如何以编程方式与按钮交互,以便在按下按钮后有效地切换到新视图?

我知道我会使用导航按钮

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Logout", style: .plain, target: self, action: #selector(handleLogout))

但是视图控制器中的任何按钮都有等效项吗?我确定有,这可能是一个简单的问题,但我们将不胜感激。

我的按钮代码是

let registerButton: UIButton = {
        let button = UIButton(type: .system)
        button.backgroundColor = UIColor.black
        button.setTitle("Register", for: .normal)
        button.layer.cornerRadius = 5
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()

并作为子视图添加到登录页面

view.addSubview(registerButton)

谢谢。

【问题讨论】:

    标签: ios xcode swift3


    【解决方案1】:

    segue 是 Interface Builder 的术语。在 iOS 中,您只能以三种方式显示视图控制器:pushpresentshow。以编程方式,您不会将其称为 segue。首先,为您的按钮添加一个目标:

    registerButton.addTarget(self, action: #selector(registerButtonAction), for: .touchUpInside)
    

    创建动作方法:

    @objc func registerButtonAction() {
        ...
    }
    

    如果你想push 到视图控制器(使用导航控制器),从动作方法内部推送到它:

    @objc func registerButtonAction() {
        let destination = SomeViewController()
        navigationController?.pushViewController(destination, animated: true)
    }
    

    如果你想展示它(模态):

    @objc func registerButtonAction() {
        let destination = SomeViewController()
        destination.transitioningDelegate = SomePresentationAnimationVendor() // for custom presentations
        destination.modalPresentationStyle = .custom // for custom
        present(destination, animated: true, completion: nil)
    }
    

    【讨论】:

    • 我接受了这个答案,因为它让我知道了如何解决这个问题。但在 registerButtonAction 我需要使用 'present(destination, animated: true, completion: nil)' 方法。我还打印了一些文本以确保该方法总是被调用,并且确实如此,但由于某种原因,'navigationConrtoller?.pushViewController...' 行代码没有推送到我的新 VC。任何想法为什么会这样?
    • 这一定是因为您没有正确设置您的UINavigationController
    【解决方案2】:

    为您的按钮添加一个目标,以便在点击按钮时执行一个功能。

    registerButton.addTarget(self, action: #selector(self.registerTapped(_:)), for: .touchUpInside) 
    

    创建函数registerTapped

    // Swift 4 requires @objc
    @objc func registerTapped(_ sender: UIButton){  
        // Segue here
    }
    

    编写你的 segue 代码并将其放入 registerTapped

    self.performSegue(withIdentifier: "segueName", sender: nil)
    

    大家一起来

    override func viewDidLoad() {
        super.viewDidLoad()
    
        registerButton.addTarget(self, action: #selector(self.registerTapped(_:)), for: .touchUpInside) 
    }
    
    @objc func registerTapped(_ sender: UIButton) {  
        self.performSegue(withIdentifier: "segueName", sender: nil)
    }
    

    【讨论】:

    • 我投了赞成票,因为我有一个自定义的 rightbarbuttontem 作为按钮并且它没有注册触摸,尽管数据已传输到 secondviewcontroller 即 performeguewithidentifier 部分工作,但使用 performeguewithidentifier 的推送操作不起作用。现在,我的视图控制器中有两个 segue,一个用于传输数据,另一个(您的)用于注册触摸和推送。无论如何,它的工作。谢谢。
    【解决方案3】:

    您应该为您的按钮编写函数并将其分配给按钮

    override func viewDidLoad() {
      super.viewDidLoad()
      ...
      button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
    }
    
    func buttonAction(sender: UIButton!) {
      print("Button tapped")
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多