在 Swift 项目中正确使用 Obj-C 库
Properly using Obj-C library in Swift project
编辑:我认为这可能与从 objective-c 库加载 .xib 并将其显示在 swift 的视图控制器
上有关
我一直在尝试在 swift 应用程序中使用 https://github.com/promet/PRAugmentedReality 库。
它与 obj-c 完美配合,例如:
但是当我将它连接到 swift 项目时,它开始像这样:
下面你可以看到我的 steps 当我将这个库集成到我的 swift 项目时,我的 swift 项目的代码和下载 link 两个 objective-c 和 swift 个项目。这里还有 PR 增强现实框架的 youtube 视频:
Link 1: Getting Started -> https://www.youtube.com/watch?v=fdN0XAoZXOY
Link 2: Walkthrough of Internals-> https://www.youtube.com/watch?v=Xmx-0OnzTPY
Swift 项目 steps:
- 使用名为 demoARXcode 版本 7.2.1 (7C1002) 创建单视图应用程序
- 我从 Targets -> demoAR -> Build Phases -> Link Binary with Libraries
添加 Foundation.framework、CoreGraphics.framework 和 UIKit.framework
- 然后,File -> New Target -> Cocoa Touch Framework 然后点击 Next
- 创建了一个具有以下属性的目标:产品名称:PRAR,语言:Objective-C 和组织标识符:com.timur.PRAR 然后我单击完成
- 我在 PRAR 下创建了另一个组,并将其命名为 "Classes",然后我从 framework 的 类 文件夹复制文件并将它们添加到 PRAR/Classes 文件夹。
- 我将框架的 Target Membership 的每个 .h 文件更改为 "Public"
然后我像这样将头文件导入到我的桥接文件 (PRAR.h)
#import <PRAR/ARSettings.h>
#import <PRAR/PRARManager.h>
#import <PRAR/ARController.h>
#import <PRAR/ARObject.h>
#import <PRAR/ARRadar.h>
#import <PRAR/LocationMath.h>
为了 运行 我的 swift 项目中的这个框架所做的其余工作保留在我的 ViewController.swift 文件中,例如:
import UIKit
import PRAR
var prARManager = PRARManager()
let x: Int32 = AR_VIEW_TAG
let y = Int(x)
class ViewController: UIViewController, PRARManagerDelegate{
func alert(title: String, withDetails details: String) {
print("alert function")
let alert: UIAlertView = UIAlertView(title: title, message: details, delegate: nil, cancelButtonTitle: "Ok", otherButtonTitles: "")
alert.show()
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
print("1")
// AŞAĞIDAKİ SATIRDA BİR SORUN VAR!!!
prARManager = PRARManager.init(size: self.view.frame.size, delegate: self, showRadar: true)
print("2")
}
override func viewDidAppear(animated: Bool) {
print("3")
let locationCoordinates = CLLocationCoordinate2D(latitude: 41.085468, longitude: 29.044033)
print("4")
prARManager.startARWithData(self.getDummyData() as [AnyObject], forLocation: locationCoordinates)
print("5")
}
func getDummyData() -> NSArray {
print("6")
let dummyData: [AnyObject] = [["id": 0, "lat": 40.9780919, "lon": 27.511674, "title": "Tekirdağ"], ["id": 1, "lat": 40.8025157, "lon": 29.4397941, "title": "Gebze"]]
print("7")
return dummyData;
}
func prarDidSetupAR(arView: UIView, withCameraLayer cameraLayer: AVCaptureVideoPreviewLayer, andRadarView radar: UIView) {
print("8")
NSLog("Finished displaying ARObjects")
print("9")
self.view.layer.addSublayer(cameraLayer)
print("10")
self.view!.addSubview(arView)
print("11")
self.view.bringSubviewToFront(self.view.viewWithTag(y)!)
//self.view.bringSubviewToFront(self.view!.viewWithTag(AR_VIEW_TAG));
//self.view!.bringSubviewToFront(self.view!.viewWithTag( 042313 )!)
//print("12")
self.view.addSubview(radar)
//print("13")
}
func prarUpdateFrame(arViewFrame: CGRect) {
print("14")
self.view.viewWithTag(y)?.frame = arViewFrame
print("hello")
//self.view.viewWithTag(AR_VIEW_TAG)!.frame = arViewFrame
//self.view!.viewWithTag(042313)!.frame = arViewFrame
print("15")
}
func prarGotProblem(problemTitle: String!, withDetails problemDetails: String!) {
print("16")
self.alert(problemTitle, withDetails: problemDetails)
print("17")
}
}
您可以在下面下载 objective-c 和 swift 项目。我只希望 swift 项目能够 运行 作为 objective-c 项目。我怎样才能做到这一点?我一直在遍历所有框架和我的代码,但我看不出有什么问题。 *ps:我正在使用 Xcode 版本 7.2.1
Swift 项目的 link: https://drive.google.com/file/d/0B-cDfWHidgvcYnFNcnlMZG1aaDg/view?usp=sharing
Objective-C 项目的 link: https://drive.google.com/file/d/0B-cDfWHidgvcQUFXbktYSE5CeHM/view?usp=sharing
您忘记为您的Swift项目添加框架资源,查看Obj-C项目:
与 Swift 项目相比:
确保所有必要的图像和 xib 在 "demoAR" 中具有目标成员资格:
如果您查看您的 Obj-C 项目,您会看到图像文件(如 RadarMV.png)已分配给应用程序目标。但在 Swift 项目中,它们被分配给 PRAR 目标。所以应用程序只是找不到它正在尝试加载的图像。
您可以修改代码以在 PRAR 包中查找图像。但更快的解决方案(可能不是更好)是将图像分配给应用程序目标:
这足以让我工作。
编辑:我认为这可能与从 objective-c 库加载 .xib 并将其显示在 swift 的视图控制器
上有关我一直在尝试在 swift 应用程序中使用 https://github.com/promet/PRAugmentedReality 库。
它与 obj-c 完美配合,例如:
但是当我将它连接到 swift 项目时,它开始像这样:
下面你可以看到我的 steps 当我将这个库集成到我的 swift 项目时,我的 swift 项目的代码和下载 link 两个 objective-c 和 swift 个项目。这里还有 PR 增强现实框架的 youtube 视频:
Link 1: Getting Started -> https://www.youtube.com/watch?v=fdN0XAoZXOY
Link 2: Walkthrough of Internals-> https://www.youtube.com/watch?v=Xmx-0OnzTPY
Swift 项目 steps:
- 使用名为 demoARXcode 版本 7.2.1 (7C1002) 创建单视图应用程序
- 我从 Targets -> demoAR -> Build Phases -> Link Binary with Libraries 添加 Foundation.framework、CoreGraphics.framework 和 UIKit.framework
- 然后,File -> New Target -> Cocoa Touch Framework 然后点击 Next
- 创建了一个具有以下属性的目标:产品名称:PRAR,语言:Objective-C 和组织标识符:com.timur.PRAR 然后我单击完成
- 我在 PRAR 下创建了另一个组,并将其命名为 "Classes",然后我从 framework 的 类 文件夹复制文件并将它们添加到 PRAR/Classes 文件夹。
- 我将框架的 Target Membership 的每个 .h 文件更改为 "Public"
然后我像这样将头文件导入到我的桥接文件 (PRAR.h)
#import <PRAR/ARSettings.h> #import <PRAR/PRARManager.h> #import <PRAR/ARController.h> #import <PRAR/ARObject.h> #import <PRAR/ARRadar.h> #import <PRAR/LocationMath.h>
为了 运行 我的 swift 项目中的这个框架所做的其余工作保留在我的 ViewController.swift 文件中,例如:
import UIKit import PRAR var prARManager = PRARManager() let x: Int32 = AR_VIEW_TAG let y = Int(x) class ViewController: UIViewController, PRARManagerDelegate{ func alert(title: String, withDetails details: String) { print("alert function") let alert: UIAlertView = UIAlertView(title: title, message: details, delegate: nil, cancelButtonTitle: "Ok", otherButtonTitles: "") alert.show() } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. print("1") // AŞAĞIDAKİ SATIRDA BİR SORUN VAR!!! prARManager = PRARManager.init(size: self.view.frame.size, delegate: self, showRadar: true) print("2") } override func viewDidAppear(animated: Bool) { print("3") let locationCoordinates = CLLocationCoordinate2D(latitude: 41.085468, longitude: 29.044033) print("4") prARManager.startARWithData(self.getDummyData() as [AnyObject], forLocation: locationCoordinates) print("5") } func getDummyData() -> NSArray { print("6") let dummyData: [AnyObject] = [["id": 0, "lat": 40.9780919, "lon": 27.511674, "title": "Tekirdağ"], ["id": 1, "lat": 40.8025157, "lon": 29.4397941, "title": "Gebze"]] print("7") return dummyData; } func prarDidSetupAR(arView: UIView, withCameraLayer cameraLayer: AVCaptureVideoPreviewLayer, andRadarView radar: UIView) { print("8") NSLog("Finished displaying ARObjects") print("9") self.view.layer.addSublayer(cameraLayer) print("10") self.view!.addSubview(arView) print("11") self.view.bringSubviewToFront(self.view.viewWithTag(y)!) //self.view.bringSubviewToFront(self.view!.viewWithTag(AR_VIEW_TAG)); //self.view!.bringSubviewToFront(self.view!.viewWithTag( 042313 )!) //print("12") self.view.addSubview(radar) //print("13") } func prarUpdateFrame(arViewFrame: CGRect) { print("14") self.view.viewWithTag(y)?.frame = arViewFrame print("hello") //self.view.viewWithTag(AR_VIEW_TAG)!.frame = arViewFrame //self.view!.viewWithTag(042313)!.frame = arViewFrame print("15") } func prarGotProblem(problemTitle: String!, withDetails problemDetails: String!) { print("16") self.alert(problemTitle, withDetails: problemDetails) print("17") } }
您可以在下面下载 objective-c 和 swift 项目。我只希望 swift 项目能够 运行 作为 objective-c 项目。我怎样才能做到这一点?我一直在遍历所有框架和我的代码,但我看不出有什么问题。 *ps:我正在使用 Xcode 版本 7.2.1
Swift 项目的 link: https://drive.google.com/file/d/0B-cDfWHidgvcYnFNcnlMZG1aaDg/view?usp=sharing
Objective-C 项目的 link: https://drive.google.com/file/d/0B-cDfWHidgvcQUFXbktYSE5CeHM/view?usp=sharing
您忘记为您的Swift项目添加框架资源,查看Obj-C项目:
与 Swift 项目相比:
确保所有必要的图像和 xib 在 "demoAR" 中具有目标成员资格:
如果您查看您的 Obj-C 项目,您会看到图像文件(如 RadarMV.png)已分配给应用程序目标。但在 Swift 项目中,它们被分配给 PRAR 目标。所以应用程序只是找不到它正在尝试加载的图像。
您可以修改代码以在 PRAR 包中查找图像。但更快的解决方案(可能不是更好)是将图像分配给应用程序目标:
这足以让我工作。