Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从swift中的NSObject类在UIViewController中执行函数_Ios_Swift_Uiviewcontroller_Delegates_Nsobject - Fatal编程技术网

Ios 从swift中的NSObject类在UIViewController中执行函数

Ios 从swift中的NSObject类在UIViewController中执行函数,ios,swift,uiviewcontroller,delegates,nsobject,Ios,Swift,Uiviewcontroller,Delegates,Nsobject,因此,我有一个NSObject类来控制代码中的某些内容,但我希望在NSObject类中执行UIViewController类中的方法,所以我使用了下面两种方法,但它们都不适用于我 1-我使用了委托协议,因此在视图控制器类中,我将这些 protocol ImagePickerManagerDelegate : NSObjectProtocol { func showAlert(_ type : Int) } class myViewController : UIViewControlle

因此,我有一个
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 {
   var ErrorCallback: ((Int) -> ())?

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


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

}
这是另一个类中的代码

class ImagePickerManager: NSObject {
   weak var delegate : ImagePickerManagerDelegate?
   func foo() {
      self.delegate?.showAlert(1)
   }    
 }
foo函数将执行,并且

self.delegate?.showAlert(1)
但什么也不会发生

2-我使用了回调函数,但还是什么也不会发生

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 {
   var ErrorCallback: ((Int) -> ())?

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


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

}
这是callback函数的
UIViewController
代码

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

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

如果您只是试图在NSObject类上发生事件时触发view controller类上的某些事件,则可以使用闭包

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

这只是一个简单的示例,说明了如何布局,但您可以根据自己的需要设置调用闭包的方式和时间。

您指的是哪一类?NSObject或ViewController?self.delegate?.showAlert(1)在NSObject类中而不是在我的视图控制器类中True,我的意思是编写
self.imagePicker.delegate?.showAlert(1)
。当我的NSObject类中发生某些事情时,我必须调用showAlert,以便在发生这些事情时生成数字。self.imagePicker.delegate?.showAlert(1)在NSObject类中完成此操作时将调用Yes,但尝试此操作将给出它在此处工作而不是在实际需要时工作的原因。我猜是使用
ImagePickerManager
的另一个对象调用
showAlert
方法(不是设置为委派的方法)。此方法doSomethingWithFoo()对我来说需要类型,因为我想将类型传递给视图控制器,所以如果我使用imagePicker.doSomethingWithFoo(0)例如打印(“dofoo stuff.”将立即执行,但我需要在func doSomethingWithFoo(type:Int){调用NSObject classI时执行打印。我编辑了代码,以包含可以在闭包中传递的Int类型以及只需移动
doSomethingWithFoo()的方法
放入您的NSObject类中。我只是将其放入示例的视图控制器中,以便在viewDidLoad()中调用它方法,但您需要将其移动到您希望在ImagePickerManager中调用它的任何位置:)我可以发送该类代码吗?我在操作表中为camera和Gallery使用了一个NSObject类,所有这些都在NSObject类中。我检查权限,当用户不允许应用程序使用时,我只想传递camera或Gallery的Int值他们