www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

IOS开拓OC代码中开创Swift编写的视图调整器

2019-05-31 22:11 来源:未知

IOS开发OC代码中创建Swift编写的视图控制器

OC中使用Swift

1、在项目中右键添加一个 Swift 文件,如TestSwift.swift。

2、添加后 Xcode 弹出‘是否配置 OC 桥接头文件’的提示,点确认,系统自动生成一个项目名-Bridging-Header.h的文件,如TestSwift-Bridging-Header.h。配置 OC 桥接头文件的提示。

3、TestSwift-Bridging-Header.h实质上是一个供 Swift 使用的头文件,在这里把所有要暴露给 Swift 的 OC 头文件都添加进去,这样写 Swift 的时候就可以直接使用那些 OC 的类和方法了。

因为 Swift 本身没有头文件,只有. swift;而 OC 有. h 和. m 文件。有了这个声明,.swift 就可以直接使用 OC 的. h 了。

4、接下来直接在TestSwift.swift中写 Swift 代码。

5、在 OC 中使用 Swift,我在AppDelegate.m中使用刚才创建的 Swift 类,那么先要引用 Swift 头文件,即#import "TestSwift-Swift.h",然后在这个 .m 文件中就可以任意使用 Swift 创建的类和方法了:

6、理解 #import "TestSwift-swift.h"

其实是项目名-swift.h,这也是 XCode 自动生成的,根据你写的所有 Swift 代码,生成一个 OC 的. h 文件,进行类和方法的声明,这样在 OC 里引用这个头文件后,就相当于引用了所有 Swift 声明,可以直接使用了。

需求

我们新建一个Swift类型的工程,由于种种原因,里面会有一些OC类,OC类用到了项目中的某些Swift类,而Swift类又用到了这些OC类,怎么解决?

背景

Swift 中使用 OC

Swift 代码引用 OC,需依靠Objective-C bridging header将相关文件暴露给 Swift。

创建Objective-C bridging header有两种方法:

1、当在 Swift 项目中初次尝试创建 OC 文件时(不能通过拖拽的方式加入项目),系统会自动帮你创建Objective-C bridging header.

此时除了.h、.m文件之外,会额外多出一个叫做项目工程名-Bridging-Header.h的文件,这个文件中导入的类是可以暴露给 Swift 看到的。要做的,只是#import XXXX.

2、自己创建Objective-C bridging header

File > New > File > (iOS or OS X) > Source > Header File

切记,名字一定要是项目工程名-Bridging-Header.

然后还有一步,在项目的Build Settings选项里,要确保Swift Compiler选项里有这个Bridging Header文件的设置,路径必须指向文件本身,而不是目录!

图片 1

解答

其实,Swift和OC文件是可以共存在一个工程中的,我们只需要简单的配置,和一些注意细节,就可以实现Swift和OC的混编。

近日在和一群朋友做项目,我和另一位同学负责iOS客户端,我是一直使用OC的,而他只会Swift,因此在我们分工协作之后,就需要把代码合在一起,这就牵扯到如何在TabbarController中添加一个swift创建的子控制器的问题。

步骤1:配置OC的桥接文件

1、在Swift里第一次新建OC的文件,会出现如图:

注意:以后再建,或者是拖入的OC文件,都不会有这个提示。

自己拖入的OC文件,需要手动配置桥接文件。

图片 2

2、系统会自动创建一个头文件:工程名-Bridging-Header.h

图片 3

3、如果想自定义这个头文件,把系统自动创建的删除,新建头文件:

4、配置自己的头文件:

图片 4

解决

步骤2:Swift调用OC代码

1、在桥接头文件里导入OC的头文件

图片 5

2、OC文件对外提供一个方法

1 #import <UIKit/UIKit.h>
2 
3 @interface OCVC : UIViewController
4 
5     - (void)showOCInfo;
6 
7 @end

 1 #import "OCVC.h"
 2 
 3 @interface OCVC ()
 4 
 5 @end
 6 
 7 @implementation OCVC
 8 
 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11 }
12 
13 - (void)showOCInfo{
14     NSLog(@"这是OC的方法");
15 }
16 
17 @end

3、swift直接使用swift的代码风格调用OC的方法就可以

 1 import UIKit
 2 
 3 class SwiftVC: UIViewController {
 4 
 5     override func viewDidLoad() {
 6         super.viewDidLoad()
 7         view.backgroundColor = UIColor.white
 8     }
 9     
10     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
11         
12         // 创建OC控制器对象
13         let ocVC = OCVC()
14         
15         // 调用OC控制器对象的方法
16         ocVC.showOCInfo()
17     }
18 }

首先在一个OC项目中新建一个Swift类,继承自UITableViewController,并且修改其view背景色,方便后续测试。

步骤3:如果工程中的OC文件想使用某些Swift的文件,需要配置工程的swift头文件(系统生成:工程中找不到,但可以通过方法或属性点进去)

1、swift提供方法或属性,供外界调用

 1 import UIKit
 2 
 3 class SwiftVC: UIViewController {
 4 
 5     override func viewDidLoad() {
 6         super.viewDidLoad()
 7         view.backgroundColor = UIColor.white
 8     }
 9     
10     func showSwiftInfo() -> Void {
11         print("这是Swift方法")
12     }
13 }

2、oc的.m文件先导入头文件,才可以调用,注意:一定是.m文件导入,而非.h导入

 

#import "OCVC.h"
// 头文件:工程名-swift.h

// 注意了啊,这里导头文件的时候,只能.m文件中导入,.h中不能导入,否则会报错

// 还有,如果swift中声明的属性为 可选属性(?),那么对应的oc的头文件是不会有这个属性的)

#import "test-swift.h"

 

这时候,进行编译,有可能会出错,也有可能不会出错,如果出错的话,我们还需要手动配置一下。

图片 6

我们可以先尝试配置ProdctName,一般都不会有问题,如果还是不行,再尝试配置ProductModuleName,然后进行编译。

3、这时候,我们的OC文件就可以愉快的使用OC的方式调用Swift代码了

 1 #import "OCVC.h"
 2 // 头文件:工程名-swift.h
 3 
 4 // 注意了啊,这里导头文件的时候,只能.m文件中导入,.h中不能导入,否则会报错
 5 
 6 // 还有,如果swift中声明的属性为 ?(即可选属性,那么对应的oc的头文件是不会有这个属性的)
 7 
 8 #import "test-swift.h"
 9 
10 @interface OCVC ()
11 
12 @end
13 
14 @implementation OCVC
15 
16 - (void)viewDidLoad {
17     [super viewDidLoad];
18     self.view.backgroundColor = [UIColor whiteColor];
19 }
20 
21 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
22 {
23     // 创建swift的控制器对象
24     SwiftVC *swiftVC = [[SwiftVC alloc] init];
25     
26     // 调用swift控制器对象的方法
27     [swiftVC showSwiftInfo];
28 }
29 
30 @end

 

import UIKit
class ESSwiftTableViewTestVc: UITableViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.grayColor();
  }
  // 下面省略
}

 

然后在需要使用的地方导入一个头文件,注意头文件是由系统自动生成的,为工程名-swift.h,例如我的工程名为EnjoySkill,那么这个头文件就是EnjoySkill-swift.h,系统不会进行自动补全,需要自行输入完成。

#import "EnjoySkill-swift.h"

最后,也就是需要创建控制器的时候,使用OC的语法创建。

UITableViewController *tab2 = [[ESSwiftTableViewTestVc alloc] init];

不得不说,苹果在这两种语言的衔接方面做的很自然,方便。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文章:

  • swift 单例的实现方法及实例
  • Swift 3中使用FMDB遇到的问题与解决方法
  • iOS swift实现转场动画的方法示例
  • Swift实现JSON转Model的方法及HandyJSON使用讲解
  • swift3.0 创建sqlite数据库步骤方法
  • swift guard关键字详解及使用
  • swift 字符串String的使用方法
  • swift where与匹配模式的实例详解
TAG标签:
版权声明:本文由澳门新葡8455手机版发布于www.2527.com,转载请注明出处:IOS开拓OC代码中开创Swift编写的视图调整器