Romik romikromik
Romik romikromik

Reputation: 83

How to pass the func () value of the view element to another Controller

First I'll start with what I did, and in the end I will describe the problem, so it will be clearer. In general, after Android Studio, working with view elements in Xcode is still a task. I understand that a good programmer will not write the same code twice, so that each time in different Controller does not describe each time the view elements - so I wrote this function in the main Controller

class func designForButton (button: UIButton){
    button.layer.masksToBounds = true
    button.layer.cornerRadius = 8
}

Then you can access it in different Controller

class RegisterViewController: UIViewController {

@IBOutlet weak var buttonBack: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

    ViewController.designForButton(button: buttonBack)

}

Now, what is not clear. I loaded the framework to work with Toast. And I described its values in the main Controller

func designForToast(message: String){
    let style = CSToastStyle.init(defaultStyle: {
    }())
    _ = style?.backgroundColor = UIColor.gray
    _ = style?.titleColor = UIColor.cyan
    _ = style?.messageColor = UIColor.darkGray
    self.view.makeToast(message, duration: 2, position: self.bottomLayoutGuide, title: "title", image: UIImage (named: "logo.jpg"), style: style ) { (success: Bool) in
    }
}

But the matter is that in this case I can address to it exclusively in the same Controller

_=self.designForToast(message: "Its a Toast")

As soon as I want to make func () - like class func () to work in another Controller, Xcode starts to highlight that it's impossible, and due to my small experience, I can not fix it myself.

enter image description here

Upvotes: 0

Views: 90

Answers (2)

ovidiur
ovidiur

Reputation: 338

I think you need to define a protocol , and an extension to UIViewController to provide a default implementation for your method.....if this was the question...:P

protocol ToastProtocol: class {
    func showToast(message:String)
}

extension ToastProtocol where Self: UIViewController {
    func showToast(message:String){
        ///yourcode
    }
}

After that you can youse your showToast method in any UIViewController

Upvotes: 1

Sweeper
Sweeper

Reputation: 274463

I suggest that you add a viewController parameter in the method so that it looks like this:

static func showToast(message: String, on viewController: UIViewController){ // I also renamed the method as well
    let style = CSToastStyle.init(defaultStyle: {
    }())
    _ = style?.backgroundColor = UIColor.gray
    _ = style?.titleColor = UIColor.cyan
    _ = style?.messageColor = UIColor.darkGray
    viewController.view.makeToast(message, duration: 2, position: viewController.bottomLayoutGuide, title: "title", image: UIImage (named: "logo.jpg"), style: style ) { (success: Bool) in
    }
}

I also suggest that you put these "helper functions" in a designated class, like StyleHelper or something like that.

Then you can use it like this in a View Controller:

StyleHelper.showToast(message: "Hello", on: self)

Or better yet, make this an extension method!

extension UIViewController {
    func showMyToast(message: String){
        let style = CSToastStyle.init(defaultStyle: {
        }())
        _ = style?.backgroundColor = UIColor.gray
        _ = style?.titleColor = UIColor.cyan
        _ = style?.messageColor = UIColor.darkGray
        self.view.makeToast(message, duration: 2, position: self.bottomLayoutGuide, title: "title", image: UIImage (named: "logo.jpg"), style: style ) { (success: Bool) in
        }
    }
}

You can then use it like this in a View Controller:

self.showMyToast(message: "Hello")

Side Note:

For views that conform to UIAppearance protocol, you can access the appearance() property to change its style globally. For example, you can do this in didFinishLaunchingWithOptions:

UIButton.appearance().tintColor = .red

And every UIButton you create will be red.

Upvotes: 2

Related Questions