贡献者:赵大财
博客:https://my.oschina.net/zhaodacaiGitHub:https://github.com/dacaizhao
邮箱: dacai_zhao@163.com QQ:327532817
=============================
地址:https://github.com/dacaizhao/swiftCameraAlbum 给我Star吧

使用方法:

//
//  ViewController.swift
//  swiftCameraAlbum
//
//  Created by point on 2016/11/28.
//  copyright © 2016年 dacai. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    
    
    @IBOutlet weak var cameraview: UIView! //相机显示
    @IBOutlet weak var focusView: UIImageView! //聚焦图片
    @IBOutlet weak var takePicListCollectionView: TakePicListCollectionView!//展示列表
    fileprivate var imgArr: [UIImage] = [UIImage]() //拍照的图片
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //启动照相机
        DCCameraAlbum.shareCamera.start(view: cameraview,frame: CGRect(x: 0,y: 0,width: view.frame.size.width,height: view.frame.size.height-150))
        
        //设置聚焦图片
        DCCameraAlbum.shareCamera.focusView = focusView
        
        //
    }
    
    
    //获取指定的相册 需要一定回调时间
    @IBAction func getAlbumThumb(_ sender: UIButton) {
        //默认的就是第一个
        //DCCameraAlbum.shareCamera.getAlbumItemFetchResultsDefault(thumbnailSize: <#T##CGSize#>,finishedCallback: <#T##([UIImage]) -> ()#>)
        //你还可以这样做 你可以查看任何一个相册  需要一定的等待时间 所以是回调
        let itemArr = DCCameraAlbum.shareCamera.getAlbumItem()
        let resulet  = itemArr.first?.fetchResult
        let size = CGSize(width: 100,height: 100)
        DCCameraAlbum.shareCamera.getAlbumItemFetchResults(assetsFetchResults: resulet!,thumbnailSize: size) { [uNowned self] (imgarr) in
            
            let vc = DCAlbumListViewController()
            vc.imgArr = imgarr
            self.present(vc,animated: true,completion: nil)
            
        }
    }
    
    // MARK:- 获取相册列表
    @IBAction func getAlbumListClick(_ sender: UIButton) {
        let vc = DCAlbumViewController()
        vc.dcAlbumItem =  DCCameraAlbum.shareCamera.getAlbumItem()
        present(vc,completion: nil)
        
    }
    
    
    // MARK:- 拍摄照片
    @IBAction func takePicclick(_ sender: UIButton) {
        
        DCCameraAlbum.shareCamera.takePhoto { [uNowned self] (image) in
            self.imgArr.append(image)
            self.takePicListCollectionView.imgArr = self.imgArr
            
        }
    }
    
    // MARK:- 闪光灯管理
    @IBAction func flashSegment(_ sender: UISegmentedControl) {
        switch sender.selectedSegmentIndex {
        case 0:
            DCCameraAlbum.shareCamera.flashLamp(mode: .auto)
        case 1:
            DCCameraAlbum.shareCamera.flashLamp(mode: .on)
        case 2:
            DCCameraAlbum.shareCamera.flashLamp(mode: .off)
        default:
            break
        }
    }
}

实现工具类

//
//  DCCameraAlbum.swift
//  DCCameraAlbum
//
//  Created by point on 2016/11/28.
//  copyright © 2016年 dacai. All rights reserved.
//

import UIKit
import AVFoundation
import Photos

struct Platform {
    static let isSimulator: Bool = {
        var isSim = false
        #if arch(i386) || arch(x86_64)
            isSim = true
        #endif
        return isSim
    }()
}

enum flashMode:Int {
    case off
    case on
    case auto
}

class DCCameraAlbum: NSObject {
    
    // MARK:- 相机属性
    fileprivate lazy var session : AVCaptureSession = AVCaptureSession()
    fileprivate lazy var inputDevice : AVCaptureDeviceInput = AVCaptureDeviceinput() //输入源
    fileprivate lazy var imageOutput : AVCaptureStillImageOutput = AVCaptureStillImageOutput() //输出
    lazy var priviewLayer : AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer() //视
    fileprivate var currentView: UIView! //管理控制器
    fileprivate var isUsingBackCamera:Bool = true //是否正在使用后置摄像头
    fileprivate var videoInput : AVCaptureDeviceInput?
    fileprivate var currentD :AVCaptureDevice!
    var focusView :UIView! //聚焦的View
    fileprivate var effectiveScale:CGFloat = 1.0 //默认缩放
    fileprivate var beginGestureScale:CGFloat = 1.0 //
    fileprivate let maxScale:CGFloat = 2.0 //最大缩放
    fileprivate let minScale:CGFloat = 1.0 //最小缩放
    
    // MARK:- 相册属性
    fileprivate var dCAlbumItems:[DCAlbumItem] = [] //相册列表
    fileprivate var imageManager:PHCachingImageManager! //带缓存的图片管理对象
    
    //单例
    internal static let shareCamera:DCCameraAlbum = {
        let camera = DCCameraAlbum()
        return camera
    }()
    
    //初始化
    override init() {
        super.init()
        if Platform.isSimulator {
            print("请不要使用模拟器测试")
        }
        else {
            installCameraDevice() //初始化摄像机
            
        }
    }
}

// MARK:- =============相册
class DCAlbumItem {
    //相簿名称
    var title:String?
    //相簿内的资源
    var fetchResult:PHFetchResult<PHAsset>
    init(title:String?,fetchResult:PHFetchResult<PHAsset>){
        self.title = title
        self.fetchResult = fetchResult
    }
}

// MARK: - 获取相册集合
extension DCCameraAlbum {
    // MARK: - 获取指定图片
    func getoriginalPicture(picAsset:PHAsset,finishedCallback: @escaping (_ image: UIImage) -> ()) {
        PHImageManager.default().requestimage(for: picAsset,targetSize: PHImageManagerMaximumSize,contentMode: .aspectFit,options: nil,resultHandler: {
                                                (image,_: [AnyHashable: Any]?) in
                                                finishedCallback(image!)
        })
    }
    
    // MARK: - 获取指定的相册缩略图列表
    func getAlbumItemFetchResults(assetsFetchResults: PHFetchResult<PHAsset>,thumbnailSize: CGSize,finishedCallback: @escaping (_ result : [UIImage] ) -> ()){
        cachingImageManager()
        let imageArr = fetchImage(assetsFetchResults: assetsFetchResults,thumbnailSize: thumbnailSize)
        finishedCallback(imageArr)
    }
    
    // MARK: - 获取默认的照相机照片缩略图列表
    func getAlbumItemFetchResultsDefault(thumbnailSize: CGSize,finishedCallback: @escaping (_ result : [UIImage] ) -> ()) {
        cachingImageManager()
        let allPhotosOptions = PHFetchOptions()
        //按照创建时间倒序排列
        allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate",ascending: false)]
        //只获取图片
        allPhotosOptions.predicate = nspredicate(format: "mediaType = %d",PHAssetMediaType.image.rawValue)
        let assetsFetchResults = PHAsset.fetchAssets(with: .image,options: allPhotosOptions)
        let imageArr = fetchImage(assetsFetchResults: assetsFetchResults,thumbnailSize: thumbnailSize)
        finishedCallback(imageArr)
        
    }
    
    //缓存管理
    fileprivate func cachingImageManager(){
        imageManager = PHCachingImageManager()
        imageManager.stopCachingImagesForAllAssets()
    }
    
    //获取图片
    fileprivate func fetchImage(assetsFetchResults:  PHFetchResult<PHAsset>,thumbnailSize: CGSize) -> [UIImage] {
        var imageArr:[UIImage] = []
        for i in 0..<assetsFetchResults.count {
            print(i)
            let asset = assetsFetchResults[i]
            self.imageManager.requestimage(for: asset,targetSize: thumbnailSize,contentMode: PHImageContentMode.aspectFill,options: nil) { (image,nfo) in
                                            imageArr.append(image!)
            }
        }
        return imageArr
    }
    
}
// MARK: - 获取相册列表
extension DCCameraAlbum {
    func getAlbumItem() -> [DCAlbumItem]{
        dCAlbumItems.removeAll()
        let smartOptions = PHFetchOptions()
        let smartAlbums = PHAssetCollection.fetchAssetCollections(with: .smartAlbum,subtype: PHAssetCollectionSubtype.albumRegular,options: smartOptions)
        self.convertCollection(smartAlbums as! PHFetchResult<AnyObject>)
        
        //列出所有用户创建的相册
        let userCollections = PHCollectionList.fetchTopLevelUserCollections(with: nil)
        self.convertCollection(userCollections as! PHFetchResult<AnyObject>)
        
        //相册按包含的照片数量排序(降序)
        self.dCAlbumItems.sort { (item1,item2) -> Bool in
            return item1.fetchResult.count > item2.fetchResult.count
        }
        return dCAlbumItems
        
    }
    
    //转化处理获取到的相簿
    fileprivate func convertCollection(_ collection:PHFetchResult<AnyObject>){
        
        for i in 0..<collection.count{
            //获取出但前相簿内的图片
            let resultsOptions = PHFetchOptions()
            resultsOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate",ascending: false)]
            resultsOptions.predicate = nspredicate(format: "mediaType = %d",PHAssetMediaType.image.rawValue)
            guard let c = collection[i] as? PHAssetCollection else { return }
            let assetsFetchResult = PHAsset.fetchAssets(in: c,options: resultsOptions)
            //没有图片的空相簿不显示
            if assetsFetchResult.count > 0{
                self.dCAlbumItems.append(DCAlbumItem(title: c.localizedTitle,fetchResult: assetsFetchResult ))
            }
        }
    }
}

// MARK:- =============相机
// MARK: - 开始
extension DCCameraAlbum {
    func start(view: UIView,frame: CGRect){
        currentView = view
        addPrviewLayerToView(frame: frame)
        setUpGesture() //添加手势
        if session.isRunning == false {
            session.startRunning() //不要用,模拟器测试-_-!
        }
    }
}

// MARK: - 结束
extension DCCameraAlbum {
    func stop(){
        if session.isRunning == true {
            session.stopRunning()
        }
    }
}

// MARK: - 拍照
extension DCCameraAlbum {
    func takePhoto(finishedCallback :  @escaping (_ result : UIImage ) -> ()){
        let captureConnetion = imageOutput.connection(withMediaType: AVMediaTypeVideo)
        captureConnetion?.videoScaleAndCropFactor = effectiveScale
        imageOutput.captureStillImageAsynchronously(from: captureConnetion) { (imageBuffer,error) in
            let jpegData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageBuffer)
            let jpegImage = UIImage(data: jpegData!)
            //图片入库
            UIImageWritetoSavedPhotosAlbum(jpegImage!,self,nil,nil)
            finishedCallback(jpegImage!)
        }
    }
}

// MARK: - 闪光灯
extension DCCameraAlbum {
    func flashLamp(mode:flashMode){
        do{ try currentD.lockForConfiguration() }catch{ }
        if currentD.hasFlash == false { return }
        if mode.rawValue == 0 { currentD.flashMode = .off}
        if mode.rawValue == 1 { currentD.flashMode = .on}
        if mode.rawValue == 2 { currentD.flashMode = .auto}
        
        currentD.unlockForConfiguration()
    }
}

// MARK: - 前后摄像头
extension DCCameraAlbum {
    func beforeAfterCamera(){
        //获取之前的镜头
        guard var position = videoInput?.device.position else { return }
        //获取当前应该显示的镜头
        position = position == .front ? .back : .front
        //创建新的device
        guard let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) as? [AVCaptureDevice] else { return }
        // 1.2.取出获取前置摄像头
        let d = devices.filter({ return $0.position == position }).first
        currentD = d
        //input
        guard let videoInput = try? AVCaptureDeviceInput(device: d) else { return }
        
        //切换
        session.beginConfiguration()
        session.removeInput(self.videoInput!)
        session.addInput(videoInput)
        session.commitConfiguration()
        self.videoInput = videoInput
    }
}

// MARK: - 初始化相机相关
extension DCCameraAlbum:UIGestureRecognizerDelegate{
    
    fileprivate func installCameraDevice(){
        // 1.创建输入
        // 1.1.获取所有的设备(包括前置&后置摄像头)
        guard let devices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) as? [AVCaptureDevice] else { return }
        // 1.2.取出获取前置摄像头
        guard let d = devices.filter({ return $0.position == .back }).first else{ return}
        currentD = d
        // 1.3.通过前置摄像头创建输入设备
        guard let inputDevice = try? AVCaptureDeviceInput(device: d) else { return }
        self.videoInput = inputDevice
        
        //输出
        imageOutput = AVCaptureStillImageOutput()
        imageOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG]
        
        
        //加入
        if session.canAddInput(inputDevice) == true {
            session.addInput(self.videoInput)
        }
        if session.canAddOutput(imageOutput) == true {
            session.addOutput(imageOutput)
        }
        
        //视图
        priviewLayer = AVCaptureVideoPreviewLayer(session:session)
        priviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        
        //闪光灯
        do{ try d.lockForConfiguration() }catch{ }
        if d.hasFlash == false { return }
        d.flashMode = AVCaptureFlashMode.auto
        d.unlockForConfiguration()
    }
    
    //显示View
    fileprivate func addPrviewLayerToView(frame:CGRect) -> Void{
        priviewLayer.frame = frame
        //currentView.layer.masksToBounds = true
        currentView.layer.insertSublayer(priviewLayer,at: 0)
    }
    
    
    //添加手势 + 缩放 + 聚焦
    fileprivate func setUpGesture() {
        let pinGesutre = UIPinchGestureRecognizer(target: self,action: #selector(pinFunc(_:)))
        pinGesutre.delegate = self
        currentView.addGestureRecognizer(pinGesutre)
        
        let tapGesutre = UITapGestureRecognizer(target: self,action: #selector(tipFunc(_:)))
        currentView.addGestureRecognizer(tapGesutre)
    }
    
    //添加上聚焦
    @objc func tipFunc(_ ges:UITapGestureRecognizer) {
        let currentPoint  = ges.location(in: currentView)
        currentView.isUserInteractionEnabled = false
        
        dispatchQueue.main.asyncAfter(deadline: .Now() + 0.9) {
            self.currentView.isUserInteractionEnabled = true
        }
        
        do{ try currentD.lockForConfiguration() }catch{ }
        if currentD.isFocusModeSupported(.autoFocus) {
            currentD.focusPointOfInterest = currentPoint
            currentD.focusMode = .autoFocus
        }
        if currentD.isExposureModeSupported(.autoExpose) {
            currentD.exposurePointOfInterest = currentPoint
            currentD.exposureMode = .autoExpose
        }
        currentD.unlockForConfiguration()
        focusView.center = currentPoint
        focusView.isHidden = false
        UIView.animate(withDuration: 0.3,animations: {
            self.focusView.transform = CGAffineTransform(scaleX: 1.25,y: 1.25);
        }) { (_) in
            UIView.animate(withDuration: 0.5,animations: {
                self.focusView.transform = CGAffineTransform.identity
            }) { (_) in
                self.focusView.isHidden = true
            }
        }
        
        
    }
    
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if gestureRecognizer .isKind(of: UIPinchGestureRecognizer.classForCoder()) {
            beginGestureScale = self.effectiveScale
        }
        return true
    }
    
    //添加缩放
    @objc func pinFunc(_ recognizer:UIPinchGestureRecognizer) {
        self.effectiveScale = self.beginGestureScale * recognizer.scale;
        if (self.effectiveScale < 1.0) {
            self.effectiveScale = 1.0;
        }
        let maxScaleAndCropFactor = imageOutput.connection(withMediaType: AVMediaTypeVideo).videoMaxScaleAndCropFactor
        if  self.effectiveScale > maxScaleAndCropFactor {
            self.effectiveScale = maxScaleAndCropFactor;
        }
        CATransaction.begin()
        CATransaction.setAnimationDuration(0.025)
        priviewLayer.setAffineTransform(CGAffineTransform(scaleX: effectiveScale,y: effectiveScale))
        CATransaction.commit()
    }
}

// MARK:- =============权限
extension DCCameraAlbum {
    //必须info.plist 配置上这2句
    //Privacy - Camera Usage Description
    //Privacy - Photo Library Usage Description
    /** 相机权限检测 */
    func cameraPermissions() -> Bool{
        let authStatus:AVAuthorizationStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)
        
        switch authStatus {
        case .denied,.restricted:
            return false
        case .authorized:
            return true
        case .notDetermined:
            AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo,completionHandler: nil)
            return true
        }
    }
    
    /** 相册权限检测 */
    func photoPermissions() -> Bool{
        let authStatus:PHAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
        switch authStatus {
        case .denied,.restricted:
            return false
        case .authorized:
            return true
        case .notDetermined:
            let vc = UIImagePickerController()
            vc.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
            return true
        }
    }
}

之上代码兼容9.0 你也可以自己尝试替换10

import UIKit
import AVFoundation

class ViewController: UIViewController,AVCapturePhotoCaptureDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
    @IBOutlet weak var cameraview: UIView!
    var captureSession = AVCaptureSession();
    var sessionOutput = AVCapturePhotoOutput();
    var sessionOutputSetting = AVCapturePhotoSettings(format: [AVVideoCodecKey:AVVideoCodecJPEG]);
    var previewLayer = AVCaptureVideoPreviewLayer();

    override func viewWillAppear(_ animated: Bool) {
        let devicediscoverySession = AVCaptureDevicediscoverySession(deviceTypes: [AVCaptureDeviceType.builtInDuoCamera,AVCaptureDeviceType.builtInTelephotoCamera,AVCaptureDeviceType.builtInWideAngleCamera],mediaType: AVMediaTypeVideo,position: AVCaptureDevicePosition.unspecified)
        for device in (devicediscoverySession?.devices)! {
            if(device.position == AVCaptureDevicePosition.front){
                do{
                    let input = try AVCaptureDeviceInput(device: device)
                    if(captureSession.canAddInput(input)){
                        captureSession.addInput(input);

                        if(captureSession.canAddOutput(sessionOutput)){
                            captureSession.addOutput(sessionOutput);
                            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession);
                            previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
                            previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait;
                            cameraview.layer.addSublayer(previewLayer);
                        }
                    }
                }
                catch{
                    print("exception!");
                }
            }
        }
    }

swift3.0 自定义相册相机的更多相关文章

  1. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  3. iOS Swift上弃用后Twitter.sharedInstance().session()?. userName的替代方案

    解决方法如果您仍在寻找解决方案,请参阅以下内容:

  4. 使用Fabric SDK iOS访问Twitter用户时间线

    我试图在这个问题上挣扎两天.我正在使用FabricSDK和Rest工具包,试图为Twitter使用不同的RestAPIWeb服务.我可以使用具有authTokenSecret,authToken和其他值的会话对象的TWTRLogInButton成功登录.当我尝试获取用户时间线时,我总是得到失败的响应,作为:{“errors”:[{“code”:215,“message”:“BadAuthentic

  5. ios – 如何从Apple Watch调用iPhone上定义的方法

    有没有办法从Watchkit扩展中调用iPhone上的类中定义的方法?根据我的理解,目前在Watchkit和iPhone之间进行本地通信的方法之一是使用NSUserDefaults,但还有其他方法吗?

  6. ios – 如何将视频从AVAssetExportSession保存到相机胶卷?

    在此先感谢您的帮助.解决方法只需使用session.outputURL=…

  7. ios – 使用AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto拉伸捕获的照片

    解决方法所以我解决了我的问题.这是我现在使用的代码,它工作正常:…重要的输出imagaView:一些额外的信息:相机图层必须是全屏,并且outputimageView也必须是.我希望这些对某些人来说也是有用的信息.

  8. 我可以在iOS中自定义Twitter工具包的登录按钮吗?

    我已经下载了Twitter工具包框架并添加了用Twitter登录的代码.但是,我不希望登录按钮看起来像那样.我想要一个用于登录的自定义按钮.我能这样做吗?我只想使用这个框架,因为这也适用于iOS系统帐户.解决方法根据document:在按下按钮中添加代码:Objective-C的迅速

  9. ios – AVCaptureSession条形码扫描

    解决方法以下是我所拥有的项目代码示例,可以帮助您走上正确的轨道

  10. ios – 如何在Watch OS 2中引用不支持的框架

    有没有办法将框架链接到扩展名?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部