我的Swift文件中有一个Initializer方法,如下所示:
public init(frame: CGRect, type: NVActivityIndicatorType? = nil, color: UIColor? = nil, padding: CGFloat? = nil) {
self.type = type ?? NVActivityIndicatorView.DEFAULT_TYPE
self.color = color ?? NVActivityIndicatorView.DEFAULT_COLOR
self.padding = padding ?? NVActivityIndicatorView.DEFAULT_PADDING
super.init(frame: frame)
isHidden = true
}
我想从Objective-C文件中调用此方法,但在编译时抛出错误。
错误:
/用户/桌面/旧 data / ChatScreenViewController.m:396:92:不 'NVActivityIndicatorView'的可见@interface声明了选择器 'initWithFrame:方法类型:颜色:填充:
Obj-C主叫代码:
NVActivityIndicatorView *objNVActivityIndicatorView = [[NVActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) type:NVActivityIndicatorTypeLineScalePulseOut color:[UIColor blueColor] padding:10]
我尝试过的事情:
在我的swift课程中添加了@objc
@objc public final class NVActivityIndicatorView: UIView
仍然无法访问上述方法。
我的Swift文件:NVActivityIndicatorView.swift
任何想法出了什么问题?
提前致谢!
答案 0 :(得分:4)
要在Objective-C中可访问和使用,Swift类必须是a Objective-C类的后代,或者必须标记为@objc。
还有answer。
This apple doc也可以帮助您理解。
因此,您可以选择从某个Objective C类继承您的类(在这种情况下,编译器添加@objc
)或者将@objc
自己添加到您的类中。
您还需要添加到Objective C类 -
#import "<#ProjectName#>-Swift.h"
对此特定问题的真正解决方案
请查看this question,您将自行获得解决方案。 :)
该问题表明optional parameters
无法从Swift暴露给Objective C,因为所有参数都变为_Nonnull
。
所以我认为你需要创建另一个没有选项和默认参数的初始化器。
答案 1 :(得分:3)
尝试将@objc添加到函数中:
@objc public init(frame:CGRect,type:NVActivityIndicatorType?= nil,color:UIColor?= nil,padding:CGFloat?= nil){
您需要创建一个桥接标头。看到 https://medium.com/ios-os-x-development/swift-and-objective-c-interoperability-2add8e6d6887
答案 2 :(得分:0)
尝试在Build Phases中将@objc添加到Swift类 - &gt;编译Source并再次调用该方法。我希望这会奏效。