从Objective-C类的按钮操作加载一个基于Swift的ViewController

4

注意: 这不是任何问题的重复。我无法找到任何一个问题,其中包含一些操作方法并创建了一个基于Swift的视图控制器实例。

我在Objective-C类的.m文件中调用了一个基于Swift的视图控制器。

在我的ViewController.m中,我已经导入了桥接头文件。

#import "ViewController.h"
#import "Project-Bridging-Header.h"

我想从下面的操作中调用基于Swift的视图控制器。
- (IBAction)tappedButnGo:(UIButton *)sender {

     SwiftViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"SwiftViewController"];
}

我这里遇到了一个错误

未声明的标识符 SwiftViewController 的使用

下面是 Swift 类的代码:

import UIKit

@objc class SwiftViewController: UIViewController {
 //so on

我的BridgingHeader是空的。

当我点击Objective C的按钮动作时,有人能帮我加载SwiftViewController吗?

3个回答

8
您需要在您的Controller.h文件中import以下语句。
#import "ProductModuleName-swift.h"

在这里,PrductModuleName是您的项目名称。

希望这能帮到您。


#import "AutoLayout-Swift.h",AutoLayout 是我的项目名称。 - Santo
我正在ViewController.m中导入它,这是Obj-c类。 - Santo
1
@NiravD,我的项目名称是X-Ample,那我该怎么做呢?还有当我使用X-Ample-swift.h或XAmple-swift.h时,我遇到了文件未找到的错误。 - Abirami Bala
@AbiramiBala,你可以尝试使用 #import "X_Ample.h",如果还不行,那么你可以在 Build Setting 中搜索 Objective-C Generated Interface Header Name,找到运行时生成的 Swift.h 文件名,并使用它。参考此图片 - Nirav D
@Nirav X_Ample-swift.h 对我有用,谢谢你的关心。 - Abirami Bala
显示剩余2条评论

5

请检查故事板SwiftViewController的标识符,如下图所示,您需要从身份检查器中设置您的SwiftViewControllerStoryBoard ID:

以下是在Objective C项目中使用swift类的步骤:

  • 创建新项目并选择Objective C语言。
  • 之后,在创建新类时,您会得到如下弹出窗口:

enter image description here

  • 创建桥接头文件,然后转到构建设置并搜索Defines Module,将其值设置为YES

  • 现在,您需要创建以下代码中的swiftVeiwControllers标识符,然后转到第一个视图控制器

    enter image description here

  • 现在,您需要导入#import "obj_swift-Swift.h"。 这里的obj_swift是您的项目名称,因此它看起来像#import "yourprojectname-Swift.h"


就是这样,现在您只需要编写以下代码:

- (IBAction)PushSwift:(id)sender {

     SwiftViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"SwiftViewController"];

    [self.navigationController pushViewController:vc animated:YES];
} 

以下是示例演示代码:

https://github.com/nitingohel/obj_swift


不起作用,仍显示相同的错误。我无法创建一个实例来使用我的 Swift 类。 - Santo
谢谢兄弟,我认为,在 #import "yourprojectname-Swift.h" 中,s(swift) 是小写的。 - Santo
它没有小写也可以工作,但我在这里有疑问,为什么只有使用小写时上面的答案才能工作? - Santo
我认为不区分大小写。 - Nitin Gohel
但是如果我保持使用Swift,会抛出文件未找到的错误。 - Santo
@NitinGohel,我发现你的演示中也出现了文件未找到错误。我的项目名称是X-Ample,那么我该怎么做呢?当我使用X-Ample-swift.h或XAmple-swift.h时,我也遇到了文件未找到的错误。 - Abirami Bala

0

我遇到了一个不同的情况,使用Xib文件而不是视图控制器:

如果有人正在寻找它,这将是正确的方法:

  1. 创建一个带有 xib 文件的新的 CocoaTouchClassenter image description here

  2. 给 Xib 文件分配 Restoration ID enter image description here

  3. 像其他人在这个问题中提到的那样,将桥接头文件放置在 "Project Target Name-Bridging-Header.h" 中。

  4. 将该头文件导入到 Objective-C 类文件中。

  5. 使用以下代码调用 Xib 文件。

    UIViewController *vc = [[UIViewController alloc] initWithNibName:@"SwiftViewControllerNibRestorationID" bundle:[NSBundle mainBundle]]; [self.navigationController pushViewController:vc animated:YES];

这里的 ActivityFollowViewController 是我的 SwiftViewControllerNibRestorationID


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接