在Swift中的NSObject类中执行UIViewController中的函数

问题描述 投票:0回答:1

所以我有NSObject类控制我的代码中的东西,但我想要在NSObject类中的UIViewController类执行方法中完成某些事情,所以我在下面使用了两种方法,但它们都不适用于我

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

}

这是CallBackFunction的UIViewController代码

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

我需要其中一种方法来执行我的代码中的函数

ios swift uiviewcontroller delegates nsobject
1个回答
0
投票

如果您只是想在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)
    }
}

这只是一个简单的例子,说明如何解决这个问题,但你可以根据需要设置闭包调用的方式和时间。

© www.soinside.com 2019 - 2024. All rights reserved.