Swift 4 –带有协议的自定义警报

时间:2018-09-24 09:50:40

标签: ios swift delegates protocols alert

我在使用自定义警报时遇到了问题,并将动作发送回了调用警报的VC。

我有两节课:

  • 工厂
  • ConfirmationAllert

我想要实现的用户旅程:

用户完成操作后,将在Factory类中执行操作,我使用以下代码致电ConfirmationAllert

func showAlert() {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let myAlert = storyboard.instantiateViewController(withIdentifier: "ConfirmationAllert")
    myAlert.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
    myAlert.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
    (view as? UIViewController)?.present(myAlert, animated: true, completion: nil)
}

ConfirmationAllert类中,我有一个按钮,该按钮:

  • 关闭警报
  • 将操作发送到 Factory -此操作是关闭 Factory VC并返回到以前的VC。

第一个操作成功完成,第二个操作不起作用。我正在使用协议将第二个动作发送到Factory VC,但是某些操作不起作用,我也不知道是什么。

这是我的代码:

工厂

final class FactoryViewController: UIViewController {
    let alert = ConfirmationAllert()

    @IBAction func didPressSave(_ sender: UIButton) {
        showAlert() 
    }

    func goToPreviousVc() {
        alert.delegate = self
        print("Inside factory") -> print don't get called
        // navigationController?.popViewController(animated: true) -> none of this works
        // dismiss(animated: true, completion: nil) -> none of this works
    }
}

extension FactoryViewController: ConfirmationAllertDelegate {
    func dismissVC() {
        goToPreviousVc()
        print("Go to previous")
    }
}

ConfirmationAllert

protocol ConfirmationAllertDelegate {
    func dismissVC()
}

class ConfirmationAllert: UIViewController {
    var delegate: ConfirmationAllertDelegate?

    @IBAction func didPressOk(_ sender: UIButton) { 
        self.delegate?.dismissVC() 
    }
}

我没有包含viewDidLoad方法,因为我在那里没有调用任何东西。

我的问题是方法goToPreviousVc()不执行任何操作。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我想您的问题是,您在var jsonServer = require('json-server') var server = jsonServer.create() server.get('/data/:id/sessions/:sessionId', function (req, res) {} 上设置了ConfirmationAllertDelegate,应该使用该委托来调用它。

相反,在创建goToPreviousVc对象时尝试设置代理人

myAlert

此后,自创建警报以来,您的警报将有一个委托,并且当您按下按钮时,它将按预期工作。

答案 1 :(得分:1)

尝试使用以下代码

let myAlert = storyboard.instantiateViewController(withIdentifier: "ConfirmationAllert")
(myAlert as? ConfirmationAllert).delegate = self
// the rest of your code