web-dev-qa-db-ja.com

iOS SwiftでUIButtonアクションをView Controllerから別のView Controllerに呼び出す方法は?

Webview Controllerには、保存機能を実行するための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?()


  }

enter image description here

どんな助けも大歓迎ですpls ..

4
Parameswaran V

この場合、CardViewControllerWebViewControllerの両方が同時に表示されるため、「通知」アプローチを使用できます。ユーザーがbackButtonをクリックしたときにCardViewControllerからの通知を投稿します。この通知は、WebViewController関数にリンクされているsaveBtnで確認できます。

//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)
}
1
dRAGONAIR

新しい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?()
    }

次に、CardViewControllerWebViewControllerを作成するときにデリゲートを設定します。

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

ビューコントローラーがストーリーボードで作成されていて、その間にセグエがある場合は、デリゲートをprepareForSegueに次のように設定できます。

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