выполнить функцию в UIViewController из класса NSObject в Swift - PullRequest
0 голосов
/ 29 апреля 2019

поэтому у меня есть класс NSObject, который контролирует что-то в моем коде, но я хочу, чтобы что-то было сделано в классе NSObject метод execute в классе UIViewController, поэтому я использовал два способа ниже, но ни один из них не работает дляme

1 - я использовал протокол делегата, поэтому в поле зрения контроллера я поместил эти

protocol ImagePickerManagerDelegate : NSObjectProtocol {
    func showAlert(_ type : Int)
}

class myViewController : UIViewController , ImagePickerManagerDelegate {

   func showAlert(_ type : Int) {
      print(type) 
   }

    let imagePicker = ImagePickerManager()
    override func viewDidLoad() {
       super.viewDidLoad()
       imagePicker.delegate = self
     }
 }

, а вот коды в другом классе

class ImagePickerManager: NSObject {
   weak var delegate : ImagePickerManagerDelegate?
   func foo() {
      self.delegate?.showAlert(1)
   }    
 }

будет выполняться функция foo, а также

self.delegate?.showAlert(1)

, но ничего не произойдет

2 - я использовал функцию callBack, но опять ничего не произойдет

class ImagePickerManager: NSObject {
   var ErrorCallback: ((Int) -> ())?

   func ErrorAlert(_ callback: @escaping ((Int) -> ())) {
       ErrorCallback = callback
   }


   func foo() {
      self.ErrorCallback?(1)
   }

}

и вот код UIViewController для CallBackFunction

 ImagePickerManager().ErrorAlert(self) { type in
     print(type)
 }

Мне нужен один из этих методов для выполнения функции в моем коде

1 Ответ

0 голосов
/ 29 апреля 2019

Если вы просто пытаетесь что-то вызвать в своем классе контроллера представления, когда что-то происходит с вашим классом NSObject, вы можете использовать замыкание.

Вашему классу VC будет принадлежать экземпляр вашего NSObject класса, как вы делали выше:

class MyViewController : UIViewController {

    // Instance of your NSObject class
    let imagePicker = ImagePickerManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        // You implement the closure in the VC
        imagePicker.fooHandler = { integer in
            print(integer)
        }

        // Once you've implemented the closure, when the Image Picker's doSomethingWithFoo() is called, it will trigger the closure.
        imagePicker.doSomethingWithFoo(2)
    }
}

Ваш класс NSObject будет определять замыкание, которое будет реализовано в вашем классе VC, и метод, который будет вызывать это замыкание:

class ImagePickerManager: NSObject {

    var fooHandler: ((Int) -> Void)?

    func doSomethingWithFoo(with integer: Int) {
        fooHandler?(integer)
    }
}

Это просто упрощенный пример того, как вы могли бы это изложить, но вы можете настроить, как и когда вызывается замыкание, как вам удобно.

...