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值他们