来自Objective-C的快速回调
在Swift应用程序中,我有一个来自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:
视图控制器
,它调用一个新的模式
。此模式
具有asViewController
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
}