swift出来已经有好几年了,很多ios开发者估计都想过从oc转向swift。了解过swift的同学可能都知道,相比oc,它有更简洁的语法;定义变量更简单;函数式编程的支持等等~
有些公司项目一直使用的成熟的oc,也有公司也许会采用swift来开发。各有千秋。所以,oc与swift混编的开发模式也就出来了~
下面就介绍一下如何在一个oc项目中,加入一个swift页面。实现从oc跳转swift,从swift跳转oc,页面传值。
第一步:项目配置,新增一个swift页面
OC文件配置:
在oc文件中导入:”项目名-Swift.h” 这个固定格式的文件
即可使用
SwiftViewController *viewController=[[SwiftViewController alloc] init];
[self presentViewController:viewController animated:YES completion:nil];
oc向swift页面传参:
在swift页面定义一个变量,
在oc页面中
SwiftViewController *viewController=[[SwiftViewController alloc] init];
viewController.type=@"abc";
[self presentViewController:viewController animated:YES completion:nil];
在swift页面中,即可获取这个变量
Swift页面配置:
想要在Swift页面调用OC页面的方法,必须先在之前创建好的桥接文件中加入这个OC文件
首先在Swift页面中添加一个tableView:
相关UITableView代码如下:
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{
var table:UITableView!
let arry:[String] = ["数据1", "数据2", "数据3"]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//设置UITableView的位置
let rect = self.view.frame
table = UITableView(frame: rect)
self.table.backgroundColor = UIColor.white
//设置数据源
self.table.dataSource = self
//设置代理
self.table.delegate = self
self.view.addSubview(table)
//注册UITableView,cellID为重复使用cell的Identifier
self.table.register(UITableViewCell.self, forCellReuseIdentifier: "cellID")
}
/*
@注意:我们前边的ViewController继承了UITableViewDataSource
@和 UITableViewCelegate。如果我们不注册下面的三个方法XCode就会报错!!!
*/
//设置cell的数量
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arry.count
}
//设置section的数量
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
//设置tableview的cell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = (table.dequeueReusableCell(withIdentifier: "cellID", for: indexPath)) as UITableViewCell
cell.textLabel?.text = arry[indexPath.row]
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
swift向oc页面反向传值:
反向传值,我们可以使用代理,通知中心,block等方式实现,下面我就以代理回调为例,演示一下如何从swift向oc页面反向传值。
swift页面:
添加一个协议
@objc (DidSelectDelegate)
protocol DidSelectDelegate {
func backStrData(str:String)
}
定义一个遵循协议的myDelegate对象
@objc var myDelegate:DidSelectDelegate?;
点击某一行cell,将数据传回上一个OC页面
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let string = arry[indexPath.row]
self.myDelegate?.backStrData(str: string)
self.dismiss(animated: true, completion: nil)
}
OC页面:
遵循协议
@interface ViewController ()<DidSelectDelegate>
签订协议
viewController.myDelegate=self;
实现回调方法
- (void)backStrDataWithStr:(NSString *)str
{
NSLog(@"%@", str);
}
至此,我们就可以在一个oc项目中,加入了一个带有UITableView的Swift页面,并完成了双向传值。