iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包
本文章将从两个方向分别介绍 OC 与 swift 混编
1. 第一个方向从 swift工程 中引入 oc类
1. 1 如何在swift的类中使用oc类
1.2 如何在swift中实现oc的代理方法
1.3 如何在swift中实现oc的Block回调
2 二个方向从OC工程中引入swift类
2.1 如何在OC类中使用swift类
2.2 如何在OC中实现swift的代理方法
2.3 如何在OC中实现swift中类似Block回调
下面是具体的实现过程:
1.1 如何在swift的类中使用oc类?
1. swift工程中引入OC类。 具体实现过程。
1.1 新建一个swift工程类。 取名 swiftOrOC
1.2 实现的功能为 : 从swift. viewController.swift 中 push到 OC语言 secondViewController 控制器
1.2.1 新建SecondViewController 类 。
1.2.2 建立桥接文件。 (很重要)
一定要记得点击这个按钮。
1.2.3 接下来工程目录如下:
1.2.4 接下来就可以实现具体的跳转功能了。
ViewController.swift中具体实现
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var hintLabel: UILabel! //稍后用来显示回调
// push 到 oc controller
@IBAction func pushAction(_ sender: AnyObject) {
let secondVC = SecondViewController.init()
self.navigationController?.pushViewController(secondVC, animated: true)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
1.2 如何在swift中实现oc的代理方法
1.2.1 首先在 SecondViewController.h 中声明一个协议。具体代码
#import <UIKit/UIKit.h> @protocol SecondDelegate <NSObject> -(void)refreshHintLabel:(NSString *)hintString; @end @interface SecondViewController : UIViewController @property (nonatomic,weak)id<SecondDelegate> secondDelegate;
@end
1.2.3 接下来就非常简单了,让ViewController.swift只需要成为SecondViewController的代理,然后遵循她的协议,就可以了。 具体代码如下。
1.2.3.1 遵循协议
1.2.3.2 成为代理,并实现协议方法,更改controller.swift中hintLabel的text。
- // push 到 oc controller
- @IBAction func pushAction(_ sender: AnyObject) {
- let secondVC = SecondViewController.init()
- secondVC.secondDelegate = self;
- self.navigationController?.pushViewController(secondVC, animated: true)
- }
- // SecondViewControll的代理方法
- func refreshHintLabel(_ hintString: String!) {
- hintLabel.text = "secondView textView.text = " + hintString;
- }
1.3 如何在swift中实现oc的Block回调
1.3.1 具体过程与1.2小节一样。 直接上代码。
1.3.2 声明block;
- typedef void(^RefreshHintLabelBlock)(NSString *hintString);
- @interface SecondViewController : UIViewController
- @property (nonatomic, copy) RefreshHintLabelBlock hintBlock;
- @end
1.3.3 block的回调。 SecondViewController.m中
- #pragma mark 返回上一页回调 ,将用户输入的用户名传回给 ViewController.swift
- -(BOOL)navigationShouldPopOnBackButton{
- if (_hintBlock) {
- _hintBlock(textField.text);
- }
- return YES;
- }
1.3.4 在swift类中调用 oc的block.
- // push 到 oc controller
- @IBAction func pushAction(_ sender: AnyObject) {
- let secondVC = SecondViewController.init()
- secondVC.secondDelegate = self;
- secondVC.hintBlock = {(t:String?)in
- self.hintLabel.text = "secondView textView.text = " + t!
- }
- self.navigationController?.pushViewController(secondVC, animated: true)
- }
工程已上传到git上,git地址: https://github.com/zhonggaorong/SwiftOrOc/tree/master
2. OC工程中引入swift类。 具体实现过程。
耽误了不少时间, 今天才开始写oc工程中引入swift类。
demo地址:
https://github.com/jukai9316/OCtoSwift
2.1 如何在OC类中使用swift类
- #import "OcOrSwiftTwo-swift.h"
2.2.2 在secondViewController.swift 中实现代理与闭包,代码如下:
- import UIKit
- import Foundation
- // 必须加上@objc 代理才能在oc类中可见。
- @objc(EditTextFieldDelegate)
- protocol EditTextFieldDelegate:NSObjectProtocol {
- func editTextField(_ str: String) -> Void
- }
- @objc(SecondViewController)
- class SecondViewController: UIViewController {
- var editorDelegate:EditTextFieldDelegate?
- var textField:UITextField?
- var addButton:UIButton?
- var pushButton:UIButton?
- typealias editorBlock = (_ t:String) -> Void
- var myEidtorBlock:editorBlock?
- override func viewDidLoad() {
- super.viewDidLoad()
- self.view.backgroundColor = UIColor.white
- textField = UITextField.init(frame: CGRect.init(x: 50, y: 60, width: 200, height: 50))
- textField?.placeholder = "输入返回首页的内容"
- self.view.addSubview(textField!)
- addButton = UIButton.init(type: .custom)
- addButton?.setTitleColor(UIColor.black, for: .normal)
- addButton?.setTitle("pop", for: .normal)
- addButton?.frame = CGRect.init(x: 50, y: 150, width: 200, height: 50)
- addButton?.layer.borderColor = UIColor.black.cgColor
- addButton?.layer.borderWidth = 1.0
- addButton?.addTarget(self, action: #selector(popAction), for: .touchUpInside)
- self.view.addSubview(addButton!)
- pushButton = UIButton.init(type: .custom)
- pushButton?.setTitleColor(UIColor.black, for: .normal)
- pushButton?.setTitle("push", for: .normal)
- pushButton?.frame = CGRect.init(x: 50, y: 250, width: 200, height: 50)
- pushButton?.layer.borderColor = UIColor.black.cgColor
- pushButton?.layer.borderWidth = 1.0
- pushButton?.addTarget(self, action: #selector(pushAction), for: .touchUpInside)
- self.view.addSubview(pushButton!)
- }
- func popAction() -> Void {
- if editorDelegate != nil {
- editorDelegate?.editTextField((textField?.text)!)
- }
- if ((self.myEidtorBlock) != nil){
- self.myEidtorBlock!((textField?.text!)!)
- }
- self.navigationController?.popViewController(animated: true)
- }
- func pushAction() -> Void {
- let three = ThreeViewController.init()
- self.navigationController?.pushViewController(three, animated: true)
- }
- #import "ViewController.h"
- #import "OcOrSwiftTwo-swift.h"
- @interface ViewController ()<EditTextFieldDelegate>
- @property (nonatomic, strong) UITextField *showTextField;
- @property (nonatomic, strong) UIButton *pushButton;
- @end
- @implementation ViewController
- - (void)viewDidLoad {
- [super viewDidLoad];
- _showTextField = [[UITextField alloc]initWithFrame:CGRectMake(50, 100 , 200, 50)];
- _showTextField.placeholder = @"swift传回的文本内容";
- _showTextField.adjustsFontSizeToFitWidth = YES;
- _showTextField.enabled = NO;
- [self.view addSubview:_showTextField];
- _pushButton = [UIButton buttonWithType:UIButtonTypeCustom];
- [_pushButton.layer setBorderColor:[UIColor blackColor].CGColor];
- [_pushButton.layer setBorderWidth:1.0];
- [_pushButton setFrame:CGRectMake(50, 200, 200, 50)];
- [_pushButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
- [_pushButton setTitle:@"push" forState:UIControlStateNormal];
- [_pushButton addTarget:self action:@selector(pushAction) forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:_pushButton];
- }
- -(void)pushAction{
- SecondViewController *second = [[SecondViewController alloc]init];
- // second.editorDelegate = self;
- /*
- swift中的闭包回滴
- */
- second.myEidtorBlock = ^(NSString *str) {
- _showTextField.text = [NSString stringWithFormat:@"second传回信息: %@",str];
- };
- [self.navigationController pushViewController:second animated:YES];
- }
- #pragma mark swift中的代理
- -(void)editTextField:(NSString *)str{
- _showTextField.text = [NSString stringWithFormat:@"second传回信息: %@",str];
- }
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包的更多相关文章
- 李洪强iOS开发之iOS好文章收集
李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 ng ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- iOS开发之info.pist文件和.pch文件
iOS开发之info.pist文件和.pch文件 如果你是iOS开发初学者,不用过多的关注项目中各个文件的作用.因为iOS开发的学习路线起点不在这里,这些文件只会给你学习带来困扰. 打开一个项目,我们 ...
- iOS开发之WKWebView简单使用
iOS开发之WKWebView简单使用 iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...
- 李洪强iOS开发之iOS社区收集
李洪强iOS开发之iOS社区收集 项目 简述 github 全球最大的代码仓库,无论是iOS开发还是Android开发没有人不知道这个网站,它也是一个社区,你可以去follow(关注)某些人或公司. ...
- 李洪强iOS开发之iOS工具收集
李洪强iOS开发之iOS工具收集 项目 简述 日期 我是怎么慢慢变懒的 : Jenkins + 蒲公英 使用Jenkins + 蒲公英使得项目打包给测试人员自动化,大大节省了劳动力 2015.04.1 ...
- 李洪强IOS开发之iOS好项目收集
李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...
- iOS开发之UISearchBar初探
iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...
- iOS开发之UIImage等比缩放
iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...
随机推荐
- 深入解析 H.265 编码模式,带你了解Apple全面推进H.265的原因
今天我们聊聊视频编码.视频文件亘古以来存在一个矛盾:高清画质和视频体积的冲突,相同编码标准下,视频更高清,视频体积更大.因此,应用更先进的视频编码标准,降低视频体积,可以大幅降低网站的流量消耗. 目前 ...
- Nginx学习系列四默认负载均衡轮询及Ip_hash等常用指令介绍
一.简介 Upstream模块是Nginx中一个核心模块,当客户端访问Nginx服务器的时候,Nginx会从服务器列表中选取压力小的服务器,然后分配给客户端进行访问.这个过程,Nginx通过轮询算法轮 ...
- 【朝花夕拾】Android性能篇之(三)Java内存回收
在上一篇日志([朝花夕拾]Android性能篇之(二)Java内存分配)中有讲到,JVM内存由程序计数器.虚拟机栈.本地方法栈.GC堆,方法区五个部分组成.其中GC堆是一块多线程的共享区域,它存在的作 ...
- JS执行环境,作用域链及非块状作用域
JS中的执行环境,顾名思义就是变量或函数所执行时的环境.在我的理解中,执行环境和作用域相差不大. 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中.而在函数执行之后 ...
- (五)通过Python的select监控多个描述符实现并发连接
概述 本文通过使用select改写之前的服务器程序通过监控多个套接字描述符来实现并发连接并加入了一些机制让程序更加健壮,不过我们所有的实验都是建立在单词发送数据不会超过1024字节,如果超过你需要做特 ...
- Chapter 5 Blood Type——12
I blinked, my mind going blank. Holy crow, how did he do that? 我眨着眼睛,心里一片空白.天哪,他是怎么做到的? "Er, wh ...
- PE知识复习之PE的RVA与FOA的转换
PE知识复习之PE的RVA与FOA的转换 一丶简介PE的两种状态 首先我们知道PE有两种状态.一种是内存展开.一种是在文件中的状态.那么此时我们有一个需求. 我们想改变一个全局变量的初始值.此时应该怎 ...
- [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符
说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...
- MTF测试图卡规格
1.Imatest Chart Finder计算图卡大小 测试camera MTF时,需要知道所需要的图卡的大小,Imatest提供了一个网页,只要输入sensor的像素, 镜头的视场角,还有镜头到图 ...
- Java基础:HashMap中putAll方法的疑惑
最近回顾了下HashMap的源码(JDK1.7),当读到putAll方法时,发现了之前写的TODO标记,当时由于时间匆忙没来得及深究,现在回顾到了就再仔细思考了下 @Override public v ...