首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI和DJI UX SDK5(测试版)

SwiftUI和DJI UX SDK5(测试版)
EN

Stack Overflow用户
提问于 2021-04-29 23:55:43
回答 1查看 156关注 0票数 1

我正在尝试将UX SDK5(测试版0.4.1)集成到我的SwiftUI应用程序中。

作为开始,我想显示DUXBetaConnectionWidgetDUXBetaFPVWidgetDUXBetaCompassWidget

我已经构建了两个包装类。

第一个是UIViewControllerRepresantable

代码语言:javascript
复制
struct BetaDjiView<DjiWidget: DUXBetaBaseWidget>: UIViewControllerRepresentable {
    
    typealias UIViewControllerType = BetaViewController<DjiWidget>
    
    func makeUIViewController(context: Context) -> BetaViewController<DjiWidget> {
        return BetaViewController<DjiWidget>()
    }
    
    func updateUIViewController(_ uiViewController: BetaViewController<DjiWidget>, context: Context) { }
}

第二个类是另一个UIViewController包装器,它实际包含DJI。

代码语言:javascript
复制
class BetaViewController<T: DUXBetaBaseWidget> : UIViewController {
    
    var djiWidget = T()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        addChild(djiWidget)
        djiWidget.install(in: self)
        makeConstraints()
    }
    
    func makeConstraints() {
        NSLayoutConstraint.activate([
            djiWidget.view.topAnchor.constraint(equalTo: view.topAnchor),
            djiWidget.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            djiWidget.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            djiWidget.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    }
}

在我的ContentView中,我像这样实例化小部件:

代码语言:javascript
复制
var body: some View {
  GeometryReader { geometry in
    ZStack {
      BetaDjiView<DUXBetaFPVWidget>().frame(width: geometry.size.width, height: geometry.size.height)
      VStack {
        HStack {
          BetaDjiView<DUXBetaConnectionWidget>().frame(width: 25, height: 25)
          Spacer()
        }
        Spacer()
        HStack {
          BetaDjiView<DUXBetaCompassWidget>().frame(width: 75, height: 75)
          Spacer()
        }
      }.padding()
    }
  }
}

SDKManager中与产品的连接处于活动状态。

这就是让我抓狂的奇怪部分:

我把电话连到遥控器上,打开遥控器,然后打开无人机。我让遥控器和无人机连上了。

当我通过Xcode启动应用程序时,一切都很好。摄像机视频源正在显示,连接图标变为绿色。

然后,我从Xcode中停止应用程序,并直接从手机启动应用程序。应用程序出现了,但连接图标没有变化,并且保持红色,也没有显示摄像头视频。

当我将日志流式传输到我的Mac控制台时,我可以看到,与产品的连接就在那里。

这会是什么呢?任何帮助我都会非常感谢。

编辑1

这是我的Podfile

代码语言:javascript
复制
platform :ios, '11.0'

target 'DjiMobileSdkTest2' do
  use_frameworks!
  pod 'iOS-Color-Picker'
  pod 'DJI-UXSDK-iOS-Beta', '0.4.1'
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |configuration|
      target.build_settings(configuration.name)['ARCHS'] = '$(ARCHS_STANDARD)'
    end
  end
end

编辑2

另一个额外的观察:我从手机上完全删除了这个应用程序,然后在Xcode中再次启动它,我确认了询问蓝牙和位置使用许可的对话框,这是我想要的。然后,应用程序将再次没有反应,停留在其初始状态。只有当我通过Xcode重新启动时,连接图标才会变绿,视频脚部也会显示出来。

编辑3

我观察到:在重启手机,然后通过点击应用程序图标直接启动应用程序后,一切都正常工作:应用程序启动,连接到无人机,连接图标变成绿色,摄像头视频也在更新。我能够重复这个过程好几次。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-07 13:32:07

它终于成功了!

正如在this post中所解释的那样,我不得不用它的didFinishLaunchingWithOptions-lifecycle将AppDelegate重新引入我的应用程序中。

这是它以前的样子:

代码语言:javascript
复制
@main
struct MyApp: App {
    
    var someClass = SomeClass()

    @Environment(\.scenePhase) private var scenePhase
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase) { (newScenePhase) in
            switch newScenePhase {
            case .active:
                print("active")
                someClass.doSomethingThatWouldNotWorkBefore()
            case .background:
                print("background")
            case .inactive:
                print("inactive")
            @unknown default:
                print("default")
            }
        }
    }
}

这就是它之后的样子:

代码语言:javascript
复制
import SwiftUI

class AppDelegate: UIResponder, UIApplicationDelegate {

    var someClass = SomeClass()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        someClass.doSomethingThatWouldNotWorkBefore()
        return true
    }
}

@main
struct MyApp: App {
    
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .onChange(of: scenePhase) { (newScenePhase) in
            switch newScenePhase {
            case .active:
                print("active")
            case .background:
                print("background")
            case .inactive:
                print("inactive")
            @unknown default:
                print("default")
            }
        }
    }
}

就这么简单;-)

我仍然在试图弄清楚它们的确切区别是什么,以及这与应用程序启动和生命周期、内存管理和“那些东西”有什么关系。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67320963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档