Как передать данные из swift в objective c с помощью делегата протокола?

#ios #objective-c #swift #delegates #protocols

#iOS #objective-c #swift #делегаты #протоколы

Вопрос:

У меня есть проект, созданный с помощью objective c.

objective c -> swift -> вернуть objective c

Чтобы передать данные UIImage в таком порядке, я работал следующим образом.

Однако мне удалось передать данные UIImage из objective c в swift, но UIImage не удалось передать данные обратно в objective c.

Причина в том, что делегат равен нулю в swift.

Я был бы очень признателен, если бы вы сообщили мне, где что-то пошло не так в приведенном ниже коде.

Viewcontroller.h

 #import <UIKit/UIKit.h>
@protocol imageDelegate <NSObject>

-(void)send: (UIImage *)sendImage;

@end

@interface ViewController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate,imageDelegate> {
    UIImagePickerController *imagePickerController;
    
}
@property (nonatomic, weak) id<imageDelegate> delegate;
@end
 

Viewcontroller.m

 #import "ViewController.h"
#import "imagePointer-Swift.h"

@interface ViewController ()<imageDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    imagePickerController = [[UIImagePickerController alloc] init];
    imagePickerController.delegate = self;
}

- (IBAction)btnPhoto:(id)sender {
    imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    [self presentViewController:imagePickerController animated:YES completion:nil];
}

-(void)send: (UIImage *)sendImage {
    _imageView.image = sendImage;
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

   UIImage *pickedImage = info[UIImagePickerControllerOriginalImage];
    
    if (pickedImage) {
        NSLog(@"picked : %@", pickedImage);
    }
    [self dismissViewControllerAnimated:YES completion:nil];
    
    ScViewController *scv = [[ScViewController alloc] initWithNibName:@"ScViewController" bundle:nil];
    scv.img = pickedImage;
    NSLog(@"scv.imgView : %@", scv.img);
    [self presentViewController:scv animated:YES completion:nil];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end

 

bridging-header.h

 #import"ViewController.h"
 

ScViewController.swift

 import UIKit

@objc class ScViewController: UIViewController {
    
    @objc(img)
    
    var img:UIImage!   
    var arrowImageView: UIImageView = UIImageView()
    var delegate : imageDelegate!    
    @IBOutlet weak var imgView: UIImageView!
        
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        imgView.image = img
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func btnSave(_ sender: Any) {    
        if delegate == nil{
            print("delegate : nil") // I don't know why delegate is nil
        }else{
            delegate.send(imgView.image)
        }
        self.dismiss(animated: true, completion: nil)
    }
 

Комментарии:

1. «не удалось UIImage передать данные обратно в objective c» Это цикл сохранения, верно?

2. Вы никогда не назначаете делегата? Я думаю, что сразу после scv.img = pickedImage; того, как вам нужно scv.delegate = self;

3. ваш класс swift не соответствует протоколу. UIViewController по сравнению с используемым классом ViewController или более понятным, чтобы угадать, что происходит, это может выглядеть @objc class ScViewController : UIViewController, imageDelegate { ... } @objc class ScViewController : ViewController { ... } так, что ваш класс swift до сих пор следует своей собственной схеме делегирования.