Я разрабатываю настраиваемый общий вид предупреждений, который показан ниже:
Просмотр предупреждений Снимок экрана
Однако 2кнопки в этом представлении всегда выполняют одно и то же действие.
Он всегда выполняет вторую строку кода ниже для обеих кнопок.
optionAlertVC.btn_ok.actionHandle(controlEvents: .touchUpInside, ForAction: ok)
optionAlertVC.btn_cancel.actionHandle(controlEvents: .touchUpInside, ForAction: cancel)
Покажите код, помогающий мне решить эту проблему.
ViewController:
func logout() {
AlertManager.shared.showAlertWithTwoOptions(viewController: self, message: "Confirm to logout?", okTitle: "Log out", dismissTitle: "Cancel", ok: {
self.gotoLogin()
}, cancel: {
//nothing to do
}, title: "Logout")
}
AlertManager:
typealias ok = () -> Void
typealias cancel = () -> Void
func showAlertWithTwoOptions(viewController: UIViewController, message: String, okTitle: String, dismissTitle:String, ok: @escaping ok , cancel: @escaping cancel, title:String? = nil) {
guard let optionAlertVC = Bundle.main.loadNibNamed("AlertView", owner: nil, options: nil)?[1] as? OptionAlertVC else {
print("error in loading error alert")
return
}
optionAlertVC.lbl_title.text = title ?? "Warning"
optionAlertVC.lbl_message.text = message
optionAlertVC.iv_icon.image = UIImage(named: "icon_warning")
optionAlertVC.btn_ok.backgroundColor = UIColor.MyTheme.greenSuccess
optionAlertVC.btn_ok.setTitle(okTitle, for: .normal)
optionAlertVC.btn_ok.titleLabel!.adjustsFontSizeToFitWidth = true
optionAlertVC.btn_cancel.backgroundColor = UIColor.MyTheme.redWarning
optionAlertVC.btn_cancel.setTitle(dismissTitle, for: .normal)
optionAlertVC.btn_cancel.titleLabel!.adjustsFontSizeToFitWidth = true
optionAlertVC.btn_cancel.titleLabel?.numberOfLines = 1
optionAlertVC.btn_ok.actionHandle(controlEvents: .touchUpInside, ForAction: ok)
optionAlertVC.btn_cancel.actionHandle(controlEvents: .touchUpInside, ForAction: cancel)
viewController.present(optionAlertVC, animated: true, completion: nil)
}
UIButtonExtension:
extension UIButton {
fileprivate func actionHandleBlock(action:(() -> Void)? = nil) {
struct __ {
static var action :(() -> Void)?
}
if action != nil {
__.action = action
} else {
__.action?()
}
}
@objc private func triggerActionHandleBlock() {
self.actionHandleBlock()
}
func actionHandle(controlEvents control :UIControl.Event, ForAction action:@escaping () -> Void) {
self.actionHandleBlock(action: action)
self.addTarget(self, action: #selector(UIButton.triggerActionHandleBlock), for: control)
}
}