当前位置: > > > Swift调用Objective-C编写的代码(颜色选择器KKColorListPicker调用)

Swift调用Objective-C编写的代码(颜色选择器KKColorListPicker调用)

(本文代码已升级至Swift4)

Swift 项目中,我们可以导入任意用 Objective-C 写的框架,代码库等。下面以 Swift 调用 Objective-C 编写的颜色选择器 KKColorListPicker 为例。

效果图如下:
      

实现步骤:
1,首先在项目里导入 KKColorListPicker 的源码(整个文件夹,在项目上有键“Add Files To XXX”).

2,手工创建桥接头文件 bridge.h 来包含需要引用的 Objective-C 头文件,内容如下:
//KKColorsSchemeType.h已经包含在KKColorListViewController.h
#import "KKColorListViewController.h"
#import "KKColor.h"

3,选择项目,在 Build Setting -> Swift Compiler-Code generation -> Objective-C Bridging Header 设置里添加 bridge.h,如下图所示:

4,页面使用样例(ViewController.swift
import UIKit

class ViewController: UIViewController, KKColorListViewControllerDelegate {
    
    //Object-C编写的颜色选择器视图
    var viewColor:KKColorListViewController!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //初始化颜色选择面板
        //这个颜色选择面板是用OC开发,我们导入头文件后就能在Swift里调用了
        viewColor = KKColorListViewController(schemeType:KKColorsSchemeType.crayola)
        //此类实现了颜色选择面板的代理协议,并重载了选择颜色和关闭2个回调函数
        viewColor.delegate = self
        
        //创建一个按钮
        let button:UIButton = UIButton(type: .system)
        //设置按钮位置和大小
        button.frame = CGRect(x:10, y:50, width:100, height:30)
        //设置按钮文字
        button.setTitle("选择背景色", for: .normal)
        button.addTarget(self, action: #selector(selColor(_:)),
                         for: .touchUpInside)
        self.view.addSubview(button);
    }
    
    //点击选择背景色的事件操作
    @objc func selColor(_ button:UIButton) {
        //显示颜色选择面板
        self.present(viewColor, animated: true, completion:nil)
    }
    
    //选择颜色后回调
    func colorListController(_ controller:KKColorListViewController,
                             didSelect color:KKColor){
        //关闭颜色选择器视图
        viewColor.dismiss(animated: true, completion:nil)
        //设置当前视图的背景颜色为用户选择的颜色
        self.view.backgroundColor = color.uiColor()
    }
    
    //用户在颜色选择器视图里点击了关闭
    func colorListPickerDidComplete(_ controller:KKColorListViewController)
    {
        //只需要关闭颜色选择器视图
        viewColor.dismiss(animated: true, completion:nil)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

源码下载:hangge_642.zip
评论4
  • 4楼
    2017-12-25 14:20
    奋斗途中

    站长,Demo运行不了啊

    站长回复

    我把文章代码更新了,你可以再看下。

  • 3楼
    2016-05-18 16:59
    linjoe

    站长,我有个项目,接口源码只有oc的,如果我只调用oc项目里的方法,该怎么弄呢?真的不想全转swift

    站长回复

    都一样的,都是创建个bridge.h头文件配置下。然后用Swift语法调用OC里的方法。

  • 2楼
    2016-05-15 14:49
    Leoyy

    Xcode 7.3.1中
    var button:UIButton = UIButton.buttonWithType(UIButtonType.System) as! UIButton;
    报错
    let button:UIButton = UIButton(type:.System) as UIButton

    站长回复

    这篇写的比较早,现在Swift语法改了许多。多谢你的提醒,现已修正。

  • 1楼
    2015-07-22 16:37
    white

    我在写代码之前的步骤都没问题,可是viewcontroller里写时,class ViewController: UIViewController, KKColorListViewControllerDelegate {,直接不给提示,后来我把文件夹里的文件全一个一个Add Files To XXX到项目里才行,还不能带文件夹。但是直接运行你的源码没问题,请问这是怎么回事?

    站长回复

    刚我又从新新建了个工程测试了下,直接选择文件夹导入是没有问题的。你检查下目录结构什么的跟我源码是不是哪里不一样。