欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包

程序员文章站 2022-04-27 09:34:09
本文章将从两个方向分别介绍 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 混编  

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 类 。

        iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包

     1.2.2 建立桥接文件。 (很重要)

iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包

 

    一定要记得点击这个按钮。 

       1.2.3  接下来工程目录如下:

iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包

       

     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 遵循协议

  iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包

     1.2.3.2 成为代理,并实现协议方法,更改controller.swift中hintlabel的text。

[objc] view plain copy
 
  1. // push 到 oc controller  
  2. @ibaction func pushaction(_ sender: anyobject) {  
  3.     let secondvc = secondviewcontroller.init()  
  4.     secondvc.seconddelegate = self;  
  5.     self.navigationcontroller?.pushviewcontroller(secondvc, animated: true)  
  6. }  
  7.   
  8. // secondviewcontroll的代理方法  
  9. func refreshhintlabel(_ hintstring: string!) {  
  10.     hintlabel.text = "secondview textview.text = " + hintstring;  
  11. }  

 

 

 

 1.3   如何在swift中实现oc的block回调

1.3.1 具体过程与1.2小节一样。 直接上代码。

 

        1.3.2 声明block;

         

[objc] view plain copy
 
  1. typedef void(^refreshhintlabelblock)(nsstring *hintstring);  
  2.   
  3. @interface secondviewcontroller : uiviewcontroller  
  4. @property (nonatomic, copy) refreshhintlabelblock hintblock;  
  5. @end  

 

 

        1.3.3 block的回调。 secondviewcontroller.m中

 

[objc] view plain copy
 
  1. #pragma mark 返回上一页回调 ,将用户输入的用户名传回给 viewcontroller.swift  
  2. -(bool)navigationshouldpoponbackbutton{      
  3.     if (_hintblock) {  
  4.         _hintblock(textfield.text);  
  5.     }  
  6.     return yes;  
  7. }  

 

 

        1.3.4 在swift类中调用 oc的block.

 

[objc] view plain copy
 
  1. // push 到 oc controller  
  2. @ibaction func pushaction(_ sender: anyobject) {  
  3.     let secondvc = secondviewcontroller.init()  
  4.       secondvc.seconddelegate = self;  
  5.     secondvc.hintblock = {(t:string?)in  
  6.         self.hintlabel.text = "secondview textview.text = " + t!  
  7.     }  
  8.     self.navigationcontroller?.pushviewcontroller(secondvc, animated: true)  
  9. }  



 

   工程已上传到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   当前文件目录看下图:  (第四个箭头: 桥接文件)
        

iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包

  
    2.2   如何在oc中实现swift的代理与闭包block方法
            
    2.2.1 如何在oc中引入swift类。#import "工程名-swift.h"
[objc] view plain copy
 
  1. #import "ocorswifttwo-swift.h"  
   2.2.2 在secondviewcontroller.swift 中实现代理与闭包,代码如下:
    注意: @objc(代理名)  才能在外部可见这个代理
 
[objc] view plain copy
 
  1. import uikit  
  2. import foundation  
  3.   
  4. // 必须加上@objc 代理才能在oc类中可见。  
  5. @objc(edittextfielddelegate)  
  6. protocol edittextfielddelegate:nsobjectprotocol {  
  7.     func edittextfield(_ str: string) -> void  
  8. }  
  9.   
  10. @objc(secondviewcontroller)  
  11. class secondviewcontroller: uiviewcontroller {  
  12.   
  13.     var editordelegate:edittextfielddelegate?  
  14.     var textfield:uitextfield?  
  15.     var addbutton:uibutton?  
  16.     var pushbutton:uibutton?  
  17.       
  18.     typealias editorblock = (_ t:string) -> void  
  19.     var myeidtorblock:editorblock?  
  20.       
  21.     override func viewdidload() {  
  22.         super.viewdidload()  
  23.         self.view.backgroundcolor = uicolor.white  
  24.         textfield = uitextfield.init(frame: cgrect.init(x: 50, y: 60, width: 200, height: 50))  
  25.         textfield?.placeholder = "输入返回首页的内容"  
  26.         self.view.addsubview(textfield!)  
  27.           
  28.         addbutton = uibutton.init(type: .custom)  
  29.         addbutton?.settitlecolor(uicolor.black, for: .normal)  
  30.         addbutton?.settitle("pop", for: .normal)  
  31.         addbutton?.frame = cgrect.init(x: 50, y: 150, width: 200, height: 50)  
  32.         addbutton?.layer.bordercolor = uicolor.black.cgcolor  
  33.         addbutton?.layer.borderwidth = 1.0  
  34.         addbutton?.addtarget(self, action: #selector(popaction), for: .touchupinside)  
  35.         self.view.addsubview(addbutton!)  
  36.           
  37.           
  38.           
  39.         pushbutton = uibutton.init(type: .custom)  
  40.         pushbutton?.settitlecolor(uicolor.black, for: .normal)  
  41.         pushbutton?.settitle("push", for: .normal)  
  42.         pushbutton?.frame = cgrect.init(x: 50, y: 250, width: 200, height: 50)  
  43.         pushbutton?.layer.bordercolor = uicolor.black.cgcolor  
  44.         pushbutton?.layer.borderwidth = 1.0  
  45.         pushbutton?.addtarget(self, action: #selector(pushaction), for: .touchupinside)  
  46.         self.view.addsubview(pushbutton!)  
  47.           
  48.     }  
  49.       
  50.     func popaction() -> void {  
  51.           
  52.         if editordelegate != nil {  
  53.             editordelegate?.edittextfield((textfield?.text)!)  
  54.         }  
  55.           
  56.         if ((self.myeidtorblock) != nil){  
  57.             self.myeidtorblock!((textfield?.text!)!)  
  58.         }  
  59.           
  60.         self.navigationcontroller?.popviewcontroller(animated: true)  
  61.     }  
  62.       
  63.       
  64.     func pushaction() -> void {  
  65.         let three = threeviewcontroller.init()  
  66.         self.navigationcontroller?.pushviewcontroller(three, animated: true)  
  67.           
  68.     }       
    2.2.3   在oc类中viewcontroller.m 文件中实现secondviewcontroller.swift的相关代理与闭包(block). 代码如下:
   
[objc] view plain copy
 
  1. #import "viewcontroller.h"  
  2. #import "ocorswifttwo-swift.h"  
  3.   
  4. @interface viewcontroller ()<edittextfielddelegate>  
  5. @property (nonatomic, strong) uitextfield *showtextfield;  
  6. @property (nonatomic, strong) uibutton *pushbutton;  
  7.   
  8. @end  
  9.   
  10. @implementation viewcontroller  
  11.   
  12. - (void)viewdidload {  
  13.     [super viewdidload];  
  14.     _showtextfield = [[uitextfield alloc]initwithframe:cgrectmake(50, 100 , 200, 50)];  
  15.     _showtextfield.placeholder = @"swift传回的文本内容";  
  16.     _showtextfield.adjustsfontsizetofitwidth = yes;  
  17.     _showtextfield.enabled = no;  
  18.     [self.view addsubview:_showtextfield];  
  19.       
  20.     _pushbutton = [uibutton buttonwithtype:uibuttontypecustom];  
  21.     [_pushbutton.layer setbordercolor:[uicolor blackcolor].cgcolor];  
  22.     [_pushbutton.layer setborderwidth:1.0];  
  23.     [_pushbutton setframe:cgrectmake(50, 200, 200, 50)];  
  24.     [_pushbutton settitlecolor:[uicolor blackcolor] forstate:uicontrolstatenormal];  
  25.     [_pushbutton settitle:@"push" forstate:uicontrolstatenormal];  
  26.     [_pushbutton addtarget:self action:@selector(pushaction) forcontrolevents:uicontroleventtouchupinside];  
  27.       
  28.     [self.view addsubview:_pushbutton];  
  29. }  
  30.   
  31.   
  32.   
  33.   
  34. -(void)pushaction{  
  35.     secondviewcontroller *second = [[secondviewcontroller alloc]init];  
  36.     // second.editordelegate = self;  
  37.       
  38.     /* 
  39.       swift中的闭包回滴 
  40.      */  
  41.     second.myeidtorblock = ^(nsstring *str) {  
  42.         _showtextfield.text = [nsstring stringwithformat:@"second传回信息: %@",str];  
  43.     };  
  44.     [self.navigationcontroller pushviewcontroller:second animated:yes];  
  45. }  
  46.   
  47. #pragma mark swift中的代理  
  48. -(void)edittextfield:(nsstring *)str{  
  49.     _showtextfield.text = [nsstring stringwithformat:@"second传回信息: %@",str];  
  50. }  
  51.   
  52. - (void)didreceivememorywarning {  
  53.     [super didreceivememorywarning];  
  54.     // dispose of any resources that can be recreated.  
  55. }