【问题标题】:What is the correct way of accessing a Swift Delegate from Objective-C?从 Objective-C 访问 Swift 委托的正确方法是什么?
【发布时间】:2015-01-20 20:24:49
【问题描述】:

环境:Xcode 6.1.1 & Xcode 6.2 Beta

问候:
我需要在同一项目中的相邻 Objective-C 文档中的 Swift 文档中发布 NSString。例如,在 Swift 页面上显示用 Objective-C 生成的“Hello World”。
我做了一个概念验证演示;根据反馈。

我正在考虑通过协议模式使用 ObjC --> Swift 委托,如下所示:

注意:Swift 文件是委托。

在这里,我从 Objective-C 调用 Swift 中的委托方法:

#pragma mark - Action methods
- (IBAction)sendDelegateAction:(UIButton *)sender {
    [_delegate radiusString:@"Hello World"];
}

我已经实例化了 Objective-C 文件以将委托链接到实例(我希望我做对了):

let geo32Controller = MyObjCTableViewController()
geo32Controller.delegate = self

到目前为止,编译器抱怨找不到 Swift 协议。
这是协议(在 Swift 中声明):

@objc protocol DiscoveryContributeProtocol {
    // optional
    func radiusString(radiusString:String)
}

这是 Objective-C 头文件中对该协议的委托引用:

@interface MyObjCTableViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, weak) id<DiscoveryContributeProtocol> delegate;
@end

但是,编译器找不到协议:


顺便说一句:当我将桥引用放在 ObjC 的头文件中时,出现编译器错误:

两个问题:

  1. 我的模式是否正确(我是否正确实例化了 ObjC)?
  2. 如何让 Objective-C 部分看到代理链接的 Swift 协议?

【问题讨论】:

    标签: objective-c swift delegation


    【解决方案1】:

    您的想法是正确的,但有一些错误阻止了它的工作。

    1. 您已将Geo32Boundaries 声明为符合DiscoveryContributeProtocol,但它不需要也没有实际实现它,它只有一个符合该协议的属性 .这就是“方法'radiusString:'未实现”错误的来源:

      @interface Geo32Boundaries: UIViewController    // <-- that's all you need
      
    2. 您错误地设置了delegate - 您那里的代码看起来像是在尝试将Geo32Boundaries 的类实例设置为self,但您也尝试像调用函数一样调用它。您需要在呈现给用户的Geo32Boundaries 视图控制器的instance 上设置委托。我不知道该代码在哪里,所以我不能举一个很好的例子,但它会是这样的:

      geo32Controller.delegate = self
      
    3. 最后,虽然不是错误,但您的协议确实应该称为DiscoveryContributeDelegate——我们通常不在协议名称中使用“协议”。

    【讨论】:

    • 好的...我已经制作了一个概念验证/演示应用程序。与您建议的修订(请参阅上面重写的问题)。我接近了吗?
    • @FrederickC.Lee 第1项不正确,桥接头导入需要在obj-c头文件中,而不是在实现文件中。这就是为什么您在界面中收到“找不到协议声明”的原因。就我个人而言,我会将桥接头导入到您的 *_prefix.h 文件中,然后您就会知道它无处不在。
    • 我已将桥接头添加到 ObjC 的头文件中。但是编译器找不到它。请参阅上面添加的要查询的材料。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2019-12-27
    • 2017-12-09
    • 1970-01-01
    • 2016-11-10
    相关资源
    最近更新 更多