从Swift类到Objective-C类的取值
我将在Objective-C应用程序中使用Swift类。我成功地将swift类集成到我的应用程序中,我也可以访问该类,但swift类没有返回值 我正在使用这个图书馆 从库中选择图像时出现问题,它应该返回图像,但没有返回 下面是一个代码:从Swift类到Objective-C类的取值,objective-c,xcode,swift,Objective C,Xcode,Swift,我将在Objective-C应用程序中使用Swift类。我成功地将swift类集成到我的应用程序中,我也可以访问该类,但swift类没有返回值 我正在使用这个图书馆 从库中选择图像时出现问题,它应该返回图像,但没有返回 下面是一个代码: @IBAction func doneButtonPressed(sender: UIButton) { let view = albumView.imageCropView UIGraphicsBeginImageContextWi
@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应用程序中运行良好。好的,那么让我们首先解释为什么它不与Objective-C一起工作,并且它只与Swift一起工作,问题是框架的构建仅与Swift兼容,目前为止还不能用于Objective-C,例如,这意味着委托不会出现在Objective-C框架的标题中 您的应用程序有一个变通方法,让我们从将库添加为pod开始,使用Xcode 9.4.1在构建设置中将Swift语言设置为4.1(对于框架):
use_frameworks!
pod 'Fusuma', :git => 'https://github.com/ytakzk/Fusuma.git', :branch => 'master'
现在创建一个名为fusumaExtension.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 Bridgeting Header.h
文件,如下所示:
#import "ViewController.h"
现在,我们可以回到Objective-C类“ViewController.h”并导入以下行:
#import <Fusuma/Fusuma-Swift.h>
#import <Fusuma/Fusuma-umbrella.h>
现在回到您的ViewController.m
并导入以下行,这使我们先前创建的扩展对objective-c可用,以便能够为fusuma设置委托:
#import <ProjectName-Swift.h>
然后实现我们在下面的header类中定义的函数,选择图像后将调用此方法:
-(void)fusumaImageSelected:(UIImage *)image{
// do what ever you want with selected image.
}
这应该是可行的,它已经被测试过了
好的,那么让我们首先解释为什么它不使用Objective-C,并且它只使用Swift,问题是框架的构建仅与Swift兼容,而不适合Objective-C使用,这意味着代理不会出现在Objective-C框架的标题中 您的应用程序有一个变通方法,让我们从将库添加为pod开始,使用Xcode 9.4.1在构建设置中将Swift语言设置为4.1(对于框架):
use_frameworks!
pod 'Fusuma', :git => 'https://github.com/ytakzk/Fusuma.git', :branch => 'master'
现在创建一个名为fusumaExtension.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 Bridgeting Header.h
文件,如下所示:
#import "ViewController.h"
现在,我们可以回到Objective-C类“ViewController.h”并导入以下行:
#import <Fusuma/Fusuma-Swift.h>
#import <Fusuma/Fusuma-umbrella.h>
现在回到您的ViewController.m
并导入以下行,这使我们先前创建的扩展对objective-c可用,以便能够为fusuma设置委托:
#import <ProjectName-Swift.h>
然后实现我们在下面的header类中定义的函数,选择图像后将调用此方法:
-(void)fusumaImageSelected:(UIImage *)image{
// do what ever you want with selected image.
}
这应该是可行的,它已经被测试过了
您是如何实现委托方法的?swift类中提供了所有委托方法,我只需在我的objective c类中导入swift类,并使用它,图像将通过委托返回。是你定的吗?您是否实现了Fosumadelegate协议的委托方法
fusumaDismissedWithImage:
或fusumaImageSelected:
?是的,我已经在我的目标c类中实现了-(void)fusumaImageSelected:(UIImage*\u Nonnull)image{NSLog(@“image%@”,image);}但是它没有被调用你是如何实现委托方法的?所有委托方法都在swift类中可用,我只是在我的objective c类中导入swift类,并使用它,图像通过委托返回。是你定的吗?您是否实现了Fosumadelegate协议的委托方法fusumaDismissedWithImage:
或fusumaImageSelected:
?是的,我已经在我的objective c类中实现了-(void)fusumaImageSelected:(UIImage*\u Nonnull)image{NSLog(@“image%@”,image);},但它没有被调用