从Swift类获取值到Objective-C类

时间:2016-05-24 12:37:05

标签: objective-c xcode swift

我将在Objective-C应用程序中使用Swift类。我成功地将swift类集成到我的应用程序中,我也可以访问该类,但是Swift类没有返回值

使用此库

https://github.com/ytakzk/Fusuma

从图库中选择图像时的问题应该返回图像,但不是

这是一个代码:

   @IBAction func doneButtonPressed(sender: UIButton) {

    let view = albumView.imageCropView

    UIGraphicsBeginImageContextWithOptions(view.frame.size, true, 0)
    let context = UIGraphicsGetCurrentContext()
    CGContextTranslateCTM(context, -albumView.imageCropView.contentOffset.x, -albumView.imageCropView.contentOffset.y)
    view.layer.renderInContext(context!)
    let image : UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    print(image)

    delegate?.fusumaImageSelected(image)
    self.dismissViewControllerAnimated(true, completion: {
    self.delegate?.fusumaDismissedWithImage?(image)
    })
}

相同的代码在Swift应用程序中运行良好。

1 个答案:

答案 0 :(得分:0)

好,然后让我们先解释一下为什么它不能与Objective-C一起使用,而只能与Swift一起使用,问题是该框架的构建仅与Swift兼容,而到目前为止还不能用于Objective-C,这意味着委托是例如,没有显示在Objective-C框架的标题中。

针对您的应用,有一种变通方法,让我们开始将库添加为Pod,使用Xcode 9.4.1在Build设置(对于框架)中将Swift Language设置为4.1:

use_frameworks!
pod 'Fusuma', :git => 'https://github.com/ytakzk/Fusuma.git', :branch => 'master'

现在创建一个名为FusumaExtention.swift的Swift文件,并在其中添加以下代码,请注意,如果是第一次添加Swift文件,它将要求您在Xcode中创建标题,然后说是,ViewController是您的Objective-C类:

import UIKit
import Fusuma

extension ViewController:FusumaDelegate {

    public func fusumaImageSelected(_ image: UIImage, source: FusumaMode) {
        // pass the selected image to your view controller method
        self.fusumaImageSelected(image)

    }

    public func fusumaMultipleImageSelected(_ images: [UIImage], source: FusumaMode) {

    }

    public func fusumaVideoCompleted(withFileURL fileURL: URL) {

    }

    public func fusumaCameraRollUnauthorized() {

    }

    func setDelegateToSelf(FusumaVC:FusumaViewController){

        FusumaVC.delegate = self

    }

}

现在,您可能会发现一个编译器错误,表明它找不到您的Objective-C类的ViewController,您需要将其导入到ProjectName-Bridging-Header.h文件中,如下所示:

#import "ViewController.h"

现在,最后我们可以回到Objective-C类“ ViewController.h”并导入以下行:

#import <Fusuma/Fusuma-Swift.h>
#import <Fusuma/Fusuma-umbrella.h>

然后在界面内添加以下方法,如下所示,选择图像时将调用此方法:

@interface ViewController : UIViewController

-(void)fusumaImageSelected:(UIImage *)image;

@end

现在回到您的ViewController.m并导入以下行,这使我们先前创建的扩展名可用于Objective-c,从而能够为fusuma设置委托:

#import <ProjectName-Swift.h> 

然后可以说您使用以下方法从Objective-C类中进行呈现:

- (IBAction)showController:(id)sender {

    FusumaViewController *fusuma = [[FusumaViewController alloc] init];
    [self setDelegateToSelfWithFusumaVC:fusuma];
    [self presentViewController:fusuma animated:true completion:nil];

}

然后实现我们在其下面的标头类中定义的功能,选择图像后将调用此方法:

-(void)fusumaImageSelected:(UIImage *)image{

    // do what ever you want with selected image.

}

这应该有效,它已经过测试。

Sample project