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。
- @ibaction func pushaction(_ sender: anyobject) {
- let secondvc = secondviewcontroller.init()
- secondvc.seconddelegate = self;
- self.navigationcontroller?.pushviewcontroller(secondvc, animated: true)
- }
-
- 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.
- @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地址:
2.1 如何在oc类中使用swift类
2.1.1 新建一个基于oc语言的工程 ,取名 ocorswifttwo
2.1. 2 实现的功能为 : 从oc类 viewcontroller中, push 至 swift语言 secondviewcontroller ,然后secondviewcontroller可以通过代理或者swift闭包把值传回viewcontroller.
2.1.3 当前文件目录看下图: (第四个箭头: 桥接文件)
2.2 如何在oc中实现swift的代理与闭包block方法
2.2.1 如何在oc中引入swift类。#import "工程名-swift.h"
- #import "ocorswifttwo-swift.h"
2.2.2 在secondviewcontroller.swift 中实现代理与闭包,代码如下:
注意: @objc(代理名) 才能在外部可见这个代理
- import uikit
- import foundation
-
- @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)
-
- }
2.2.3 在oc类中viewcontroller.m 文件中实现secondviewcontroller.swift的相关代理与闭包(block). 代码如下:
- #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.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];
-
- }
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!!
点击进行留言回复
相关文章:
-
-
-
-
iOS实现图片自动切换效果
本文实例为大家分享了ios实现图片自动切换的具体代码,供大家参考,具体内容如下#import "viewcontroller.h"#define imagevi...
[阅读全文]
-
-
-
-
-
-
-
网友评论