Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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
来自Objective-C的快速回调_Objective C_Swift_Callback_Delegates - Fatal编程技术网

来自Objective-C的快速回调

来自Objective-C的快速回调,objective-c,swift,callback,delegates,Objective C,Swift,Callback,Delegates,在Swift应用程序中,我有一个视图控制器,它调用一个新的模式。此模式具有asViewControllerObjective-C实现为ViewController\u obj\u C 这个modal是从Swift代码中显示的,我想在Objective-C代码完成时调用callback属性(使用UIImage参数) 我的回调属性“signCompleteCallback”不起作用。如何从Swift中填充回调属性并在Objective-C中调用它 SwiftViewController.swift:

在Swift应用程序中,我有一个
视图控制器
,它调用一个新的
模式
。此
模式
具有as
ViewController
Objective-C
实现为
ViewController\u obj\u C

这个
modal
是从Swift代码中显示的,我想在
Objective-C
代码完成时调用callback属性(使用UIImage参数)

我的回调属性“signCompleteCallback”不起作用。如何从
Swift
中填充回调属性并在
Objective-C
中调用它

SwiftViewController.swift:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = #selector(self.Test)
        }
    }
}

@objc func Test(image: UIImage)
{
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>


@property SEL signCompleteCallback;

- (IBAction)Done_Clicked:(id)sender;
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

   [self signCompleteCallback]; // Here is the point when I want to call me callback and as a parameter i want to send image
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>

    @property (nonatomic, strong) id <ObjC_ManagerDelegate>delegate;

    - (IBAction)Done_Clicked:(id)sender;
@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self.delegate signCallBack:image];
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.delegate = SwiftmanagerDelegate()
        }
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = testMethod(image:) //`(image:)` is not needed when not ambiguous
        }
    }
}

func testMethod(image: UIImage) {
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController<UIPopoverPresentationControllerDelegate>

typedef void (^signCompleteCallbackType)(UIImage * _Nonnull image); //Declare the block type

@property signCompleteCallbackType signCompleteCallback; //Declare the block property using the block type

- (IBAction)Done_Clicked:(id)sender;

@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    self.signCompleteCallback(image);    //Use the block just like a normal function
}
ViewController\u obj\u c.h:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = #selector(self.Test)
        }
    }
}

@objc func Test(image: UIImage)
{
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>


@property SEL signCompleteCallback;

- (IBAction)Done_Clicked:(id)sender;
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

   [self signCompleteCallback]; // Here is the point when I want to call me callback and as a parameter i want to send image
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>

    @property (nonatomic, strong) id <ObjC_ManagerDelegate>delegate;

    - (IBAction)Done_Clicked:(id)sender;
@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self.delegate signCallBack:image];
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.delegate = SwiftmanagerDelegate()
        }
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = testMethod(image:) //`(image:)` is not needed when not ambiguous
        }
    }
}

func testMethod(image: UIImage) {
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController<UIPopoverPresentationControllerDelegate>

typedef void (^signCompleteCallbackType)(UIImage * _Nonnull image); //Declare the block type

@property signCompleteCallbackType signCompleteCallback; //Declare the block property using the block type

- (IBAction)Done_Clicked:(id)sender;

@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    self.signCompleteCallback(image);    //Use the block just like a normal function
}

我找到了一个解决办法,但我对他不满意

如果有人提出更好的解决方案,我会为此感到高兴。在这个解决方案中,我不喜欢创建一个必须在Swift部件中继承的新协议(创建一个新类或在现有的SwiftViewcontroller中继承它都无所谓)

一种方法是在Objective-C中创建
@protocol

@protocol ObjC_ManagerDelegate 
-(void) signCallBack: (UIImage *)image;
@end
ViewController\u obj\u c.h:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = #selector(self.Test)
        }
    }
}

@objc func Test(image: UIImage)
{
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>


@property SEL signCompleteCallback;

- (IBAction)Done_Clicked:(id)sender;
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

   [self signCompleteCallback]; // Here is the point when I want to call me callback and as a parameter i want to send image
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>

    @property (nonatomic, strong) id <ObjC_ManagerDelegate>delegate;

    - (IBAction)Done_Clicked:(id)sender;
@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self.delegate signCallBack:image];
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.delegate = SwiftmanagerDelegate()
        }
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = testMethod(image:) //`(image:)` is not needed when not ambiguous
        }
    }
}

func testMethod(image: UIImage) {
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController<UIPopoverPresentationControllerDelegate>

typedef void (^signCompleteCallbackType)(UIImage * _Nonnull image); //Declare the block type

@property signCompleteCallbackType signCompleteCallback; //Declare the block property using the block type

- (IBAction)Done_Clicked:(id)sender;

@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    self.signCompleteCallback(image);    //Use the block just like a normal function
}
快速部分看起来像这样。创建一个新类并从
ObjC\u ManagerDelegate
继承它:

class SwiftmanagerDelegate: ObjC_ManagerDelegate {
    func signCallBack(_ image: UIImage!) {
        // do something
    } 
}
最后以委托的身份填充新类

SwiftViewController.swift:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = #selector(self.Test)
        }
    }
}

@objc func Test(image: UIImage)
{
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>


@property SEL signCompleteCallback;

- (IBAction)Done_Clicked:(id)sender;
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

   [self signCompleteCallback]; // Here is the point when I want to call me callback and as a parameter i want to send image
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>

    @property (nonatomic, strong) id <ObjC_ManagerDelegate>delegate;

    - (IBAction)Done_Clicked:(id)sender;
@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self.delegate signCallBack:image];
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.delegate = SwiftmanagerDelegate()
        }
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = testMethod(image:) //`(image:)` is not needed when not ambiguous
        }
    }
}

func testMethod(image: UIImage) {
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController<UIPopoverPresentationControllerDelegate>

typedef void (^signCompleteCallbackType)(UIImage * _Nonnull image); //Declare the block type

@property signCompleteCallbackType signCompleteCallback; //Declare the block property using the block type

- (IBAction)Done_Clicked:(id)sender;

@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    self.signCompleteCallback(image);    //Use the block just like a normal function
}

为什么不使用Objective-C block

SwiftViewController.swift:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = #selector(self.Test)
        }
    }
}

@objc func Test(image: UIImage)
{
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>


@property SEL signCompleteCallback;

- (IBAction)Done_Clicked:(id)sender;
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

   [self signCompleteCallback]; // Here is the point when I want to call me callback and as a parameter i want to send image
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>

    @property (nonatomic, strong) id <ObjC_ManagerDelegate>delegate;

    - (IBAction)Done_Clicked:(id)sender;
@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self.delegate signCallBack:image];
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.delegate = SwiftmanagerDelegate()
        }
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = testMethod(image:) //`(image:)` is not needed when not ambiguous
        }
    }
}

func testMethod(image: UIImage) {
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController<UIPopoverPresentationControllerDelegate>

typedef void (^signCompleteCallbackType)(UIImage * _Nonnull image); //Declare the block type

@property signCompleteCallbackType signCompleteCallback; //Declare the block property using the block type

- (IBAction)Done_Clicked:(id)sender;

@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    self.signCompleteCallback(image);    //Use the block just like a normal function
}
ViewController\u obj\u c.h:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = #selector(self.Test)
        }
    }
}

@objc func Test(image: UIImage)
{
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>


@property SEL signCompleteCallback;

- (IBAction)Done_Clicked:(id)sender;
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

   [self signCompleteCallback]; // Here is the point when I want to call me callback and as a parameter i want to send image
}
@interface ViewController_obj_c : UIViewController <UIPopoverPresentationControllerDelegate>

    @property (nonatomic, strong) id <ObjC_ManagerDelegate>delegate;

    - (IBAction)Done_Clicked:(id)sender;
@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self.delegate signCallBack:image];
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.delegate = SwiftmanagerDelegate()
        }
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showModalSegue" {
        if let nextVC = segue.destination as? ViewController_obj_c {

            nextVC.signCompleteCallback = testMethod(image:) //`(image:)` is not needed when not ambiguous
        }
    }
}

func testMethod(image: UIImage) {
    debugPrint("Test method was called as callback with image parameter")
}
@interface ViewController_obj_c : UIViewController<UIPopoverPresentationControllerDelegate>

typedef void (^signCompleteCallbackType)(UIImage * _Nonnull image); //Declare the block type

@property signCompleteCallbackType signCompleteCallback; //Declare the block property using the block type

- (IBAction)Done_Clicked:(id)sender;

@end
- (IBAction)Done_Clicked:(UIButton *)sender
{
    UIGraphicsBeginImageContext(_dV.bounds.size);
    [_dV.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    self.signCompleteCallback(image);    //Use the block just like a normal function
}