#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 до сих пор следует своей собственной схеме делегирования.