【问题标题】:How to call UIButton action from view controller to another view controller in iOS Swift?如何在 iOS Swift 中将 UIButton 动作从视图控制器调用到另一个视图控制器?
【发布时间】:2020-09-06 18:22:57
【问题描述】:

在 Webview 控制器中,我有 UIButton 操作来执行保存功能。我可以在 Web 视图控制器中执行操作。在我的情况下,想要从 cardViewController 执行 webview 控制器的保存操作。但没有任何效果。

这是 CardViewController 的代码:

  @IBAction func backBtn(_ sender: Any) {


        WebViewController().saveBtn(self)

   }

这是 webview 控制器的代码:

    @IBAction func saveBtn(_ sender: Any) {

    // handling code
    print("save button tapped")
    tapCallback?()


  }

任何帮助都非常感谢..

【问题讨论】:

    标签: ios swift uibutton delegates nsnotificationcenter


    【解决方案1】:

    在你的CardViewController

    let webViewController = WebViewController() //Init WebViewController
    
    webViewController.onSave = { [weak self] in
        // Do your logic when save done in WebViewController
    }
    
    present(webViewController, animated: true, completion: nil)
    

    在您的 WebViewController 中:

    class WebViewController: UIViewController {
    
        var onSave:(()->())?
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        @IBAction func buttonSaveInWebViewController(_ sender: Any) {
         // Do your logic
             onSave?()
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      由于在这种情况下CardViewControllerWebViewController 同时出现,您可以采用“通知”方法。 当用户单击返回按钮时,从CardViewController 发布通知。此通知在与saveBtn 函数链接的WebViewController 中观察到。

      //CardViewController
      @IBAction func backBtn(_ sender: Any) {
          NotificationCenter.default.post(name: NSNotification.Name(rawValue:"backButtonPressed"), object: nil)
      }
      

      这个通知可以在WebViewController观察到

      //WebViewController
      override func viewDidLoad() {
          super.viewDidLoad()
          NotificationCenter.default.addObserver(self, selector: #selector(self. saveBtn), name: "backButtonPressed", object: nil)
      }
      
      func saveBtn() {
          // your code
      }
      
      deinit {
          NotificationCenter.default.removeObserver(self)
      }
      

      【讨论】:

        【解决方案3】:

        您正在创建一个全新的WebViewController,但您应该有实际WebViewController 的参考。您可以创建一个委托连接,例如:

        protocol CardViewControllerDelegate: AnyObject {
            func didClickSaveButton()
        }
        

        然后让它在CardViewController中设置:

        class CardViewController {
            ....
            weak var delegate: CardViewControllerDelegate?
            ....
        }
        

        并让WebViewController 实现:

        extension WebViewController: CardViewControllerDelegate {
            func didClickSaveButton() {
                // handling code
                print("save button tapped")
                tapCallback?()
            }
        

        然后,在WebViewController中创建CardViewController时设置委托:

        func showCardViewController() { // or whatever the name is
            let cardVC = CardViewController() // or however you load it
            cardVC.delegate = self
            present(cardVC, animated: true) // or however you show it
        }
        

        最后,连接到代理:

        @IBAction func backBtn(_ sender: Any) {
            delegate?.didClickSaveButton()
        }
        

        如果视图控制器是在 Storyboard 中制作的,并且它们之间存在 segue,则可以在 prepareForSegue 中设置委托,例如:

        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if let cardViewController = segue.destination as? CardViewController {
                cardViewController.delegate = self
            }
        }
        

        【讨论】:

        • 感谢您的回答,我是否需要在 saveBtn 操作中调用 didClickSaveButton()?
        • 啊,我忘记添加那部分了。编辑了我的答案。
        • 我有一个我正在尝试做的更新图像。这里不使用 showCardViewController()。当从卡片视图控制器按下 btn 时如何访问 webview 控制器的保存操作。你能帮我解决这个问题吗
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多