UIViewControllers, разделяющие «универсальный» IBAction - PullRequest
0 голосов
/ 03 января 2019

У меня есть приложение с 6 UIViewControllers.

ЛЮБОЙ viewcontroller имеет такую ​​функцию:

@IBAction func onHelp(_ sender: UIBarButtonItem) {

        DispatchQueue.main.async(execute: { () -> Void in
            let helpVC =  self.storyboard?.instantiateViewController(withIdentifier: "Help") as! HelpViewController
            helpVC.starter = "MapHelp"
            helpVC.helpSubtitle = "Map"
            self.present(helpVC, animated: true, completion: nil)
        })

    }

Любой IBAction в любом viewcontroller представляет тот же HelpViewController, но передавая другие параметры (starter и helpSubtitle).

Поскольку я не люблю повторять код, прежде всего я подумал, что эту функцию следует преобразовать во что-то более общее.

Но: есть ли способ создать общий IBAction, работающий для каждого viewcontroller?

1 Ответ

0 голосов
/ 03 января 2019

Создайте BaseViewController и добавьте универсальный метод туда.

class BaseViewController: UIViewController {



override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    func genericMethod(starter: String, helpSubtitle: String){
        let helpVC =  self.storyboard?.instantiateViewController(withIdentifier: "Help") as! HelpViewController
        helpVC.starter = starter
        helpVC.helpSubtitle = helpSubtitle
        self.present(helpVC, animated: true, completion: nil)
    }

    @IBAction func onHelp(_ sender: UIButton?) {
       //You can use this method as generic IBaction if you want. It can be connected to buttons of all child View Controllers. But doing so will limit your param sending ability. On the plus side though, you won't have to define an IBAction everywhere and you can simply connect your child VC's button to Parent Class' IBAction.
    }

}

Теперь наследуйте ваши ViewControllers от этого класса, как:

import UIKit

class ViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func btnTapped(_ sender: Any) {
        genericMethod(starter: "View Controller", helpSubtitle: "I was triggered from VC1")
    }

}

и

import UIKit

class SecondViewController: BaseViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    @IBAction func btnTapped(_ sender: Any) {
        genericMethod(starter: "View Controller 2", helpSubtitle: "I was triggered from VC2")
    }

}

Вот и все. Оба ваших ViewControllers могут вызывать родительский метод. Если вы все еще хотите использовать общий IBAction, вы можете сделать это тоже, но я бы не рекомендовал этот курс, поскольку вы хотите передавать параметры, которые могут отличаться. Если бы вы хотели это сделать, это выглядело бы так:

enter image description here

Имейте в виду, что ViewController здесь унаследован от базового ViewController, поэтому он может получить доступ к IBActions, определенным в родительском классе. Все, что вам нужно сделать, это перетащить и подключиться.

...