如何将视图元素的func()值传递给另一个Controller

时间:2017-09-01 11:11:55

标签: swift

首先,我将从我所做的开始,最后我会描述问题,所以它会更清楚。一般来说,在Android Studio之后,使用Xcode中的视图元素仍然是一项任务。我明白一个优秀的程序员不会两次编写相同的代码,所以每次在不同的Controller中都不会每次都描述视图元素 - 所以我在主控制器中写了这个函数

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

然后您可以在不同的Controller

中访问它
class RegisterViewController: UIViewController {

@IBOutlet weak var buttonBack: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

    ViewController.designForButton(button: buttonBack)

}

现在,还不清楚。我加载框架与Toast一起工作。我在主控制器中描述了它的值

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

但问题是,在这种情况下,我只能在同一个控制器中解决它

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

只要我想func () - 就像class func ()在另一个控制器中工作一样,Xcode就会开始强调这是不可能的,并且由于我的经验不足,我自己也无法修复它。

enter image description here

2 个答案:

答案 0 :(得分:2)

我建议您在方法中添加viewController参数,使其如下所示:

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

我还建议您将这些“辅助函数”放在指定的类中,例如StyleHelper或类似的东西。

然后你可以在View Controller中使用它:

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

或者更好的是,将其作为扩展方法!

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

然后您可以在View Controller中使用它:

self.showMyToast(message: "Hello")

旁注:

对于符合UIAppearance协议的视图,您可以访问appearance()属性以全局更改其样式。例如,您可以在didFinishLaunchingWithOptions

中执行此操作
UIButton.appearance().tintColor = .red

您创建的每个UIButton都是红色的。

答案 1 :(得分:1)

我认为您需要定义一个协议,以及UIViewController的扩展,为您的方法提供默认实现......如果这是问题...:P

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

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

之后你可以在任何UIViewController

中使用showToast方法