从objective-C文件激活swift文件中的功能

Posted

技术标签:

【中文标题】从objective-C文件激活swift文件中的功能【英文标题】:activating function in swift file from an objective-C file 【发布时间】:2021-04-14 17:53:00 【问题描述】:

我正在开发一个应用程序(在带有故事板的 Xcode 中并用 swift 编写),但对于奖励广告(来自 AdMob),我必须使用 Objective-C 文件来处理 Objective-C 中的特定视图控制器。作为点击广告的奖励,我想在应用程序中给人员硬币,但显示硬币的标签在另一个视图控制器中(两者都与导航控制器链接)。

在互联网上搜索后我找不到解决方案,但这是我已经找到的:

在用于奖励用户的 swift 文件中(名为“RewardingUserAds.swift”):

import Foundation

@objc class RewardingUserAds: NSObject 
    
    @objc func call_increase_score() 
        
        print("Rewarding user ads is called.")
        
        Winkel_ViewController().increase_score()
    

我在互联网上发现你应该使用 NSObject 并添加 '@objc' 这就是为什么我现在有它,这会调用 'Winkel_Viewcontroller' 中的一个函数来增加硬币的变量。

我的 Objective-C 文件 ('Ad_ViewController.m') 中的一个 sn-p(我没有更改 'Ad_ViewController.h' 文件),它给出了错误:

#import "Ad_ViewController.h"
#import "Troeven-Bridging-Header.h"
#import "Troeven-Swift.h"

@import GoogleMobileAds;

@interface Ad_ViewController ()


@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation Ad_ViewController

...

    -(void) rewardedAd:(GADRewardedAd *)rewardedAd userDidEarnReward:(GADAdReward *)reward 
    
    RewardingUserAds *obj = [RewardingUserAds alloc];
    [obj call_increase_score];
    
    
    NSLog(@"User earned reward!");


问题出现在倒数第二行([obj call_increase_score] -> 使用 'call_increase_score' 应该激活/调用的 swift 文件中的函数)。错误(红色)标记为:'RewardingUserAds' 没有可见的@interface 声明选择器'call_increase_score''并且整行保持白色

我在它们之间有一个桥头堡,名为:'Troeven-Bridging-Header.h',它是空的。我在 Objective-C 方面几乎没有经验,这让我更难找到自己犯的错误。有人可以帮忙吗?

【问题讨论】:

我没有使用过 AdMob,但快速浏览一下“入门”文档并不表示您需要使用 Objective-C ... 是什么让您认为自己会这样做? 谷歌用于广告的 sdk 今年已更新,它贬低了旧的集成方式。带有如何添加基于奖励的广告指南的谷歌开发页面仅显示有关如何在 Objective-C 中添加它的信息。在尝试了大约一天让它快速工作后,我没有成功。因此,我按照指南使用了第一次成功的 Objective-C 代码。现在我唯一的问题是给予奖励(通过将 += 1 添加到常规 swift viewcontroller 中的变量)。 这听起来很奇怪,但是...在您的-(void) rewardedAd: ... 方法中,如果您开始输入RewardingU,Xcode 会自动为您完成吗? 我在上面的帖子中添加了一张照片,这是我得到的错误。我对objective-C真的不太了解,但它似乎没有将第二行与上面的行联系起来,或者至少没有找到我所指的函数。 【参考方案1】:

我找到了解决方案: 必须删除 '#import "Troeven-Bridging-Header.h"'

并改变:

RewardingUserAds *obj = [RewardingUserAds alloc];
    [obj call_increase_score];

到:

RewardingUserAds *client = [RewardingUserAds new];
    [client call_increase_score];

-> 我真的不知道它为什么有效,但它有效

【讨论】:

以上是关于从objective-C文件激活swift文件中的功能的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 访问 Objective-C #define 常量

从 Swift 测试文件中调用 Objective-C 类

在自定义 Swift 框架中的 Objective-C 文件上使用 Swift

如何从 Objective-c/Swift 中的 settings.bundle 中检索值?

将现有的objective-c静态库转换为swift

从 Objective-C 访问 Swift 扩展