【问题标题】:Beginner: Need Help Accessing Magnetometer Data using Swift初学者:需要帮助使用 Swift 访问磁力计数据
【发布时间】:2015-02-27 04:10:58
【问题描述】:

TLDR - 目标:构建一个简单的指南针应用

我是编码新手,我正在挑战自己尝试学习新东西。我研究了编码的主要组成部分,并遵循了一些简单的教程。我在这里也学到了很多东西。

但是,我仍然很难理解如何检索磁力计数据。我已经阅读了 Obj-C 和 Swift 中的 Apple 文档(Swift 是新的,指南针教程几乎完全是在 Obj-C 中完成的),但是对于像我一样新的人来说,当他们尝试将其转换为 swift。

我查找了类似的问题,甚至尝试从中运行代码,但我通常会收到至少 1 个错误,说明某些内容是预期的、缺失的或未定义的。甚至阻止我对其进行测试......这让我在试图理解 Xcode 的错误语法方面走了很长一段路。

我知道我必须在我的设备上进行测试,否则我将看不到任何数据。我也知道我必须导入 CoreMotion,然后使用 CMMotionManager 作为一种“网关”来检索数据,然后定义更新间隔。但我不清楚如何构建实际检索数据的那部分代码。

简而言之,我只想获得最简单的准系统来检索数据并在我移动手机时打印它。欢迎对过程进行简单的解释。我保证我不会被冒犯,事实上我会很高兴。

有人在教书吗?

【问题讨论】:

    标签: ios swift core-motion compass magnetometer


    【解决方案1】:

    如果您想构建一个简单的指南针应用程序,我建议您首先使用CLLocationManager 而不是CMMotionManager。你实现了CLLocationManagerDelegate (docs) 的locationManager(didUpdateHeading:) 方法。此外,您创建一个 CLLocationManager (docs) 并开始标题更新,例如在 viewDidLoad 您可以在 XCode 为您创建的视图控制器中执行此操作:

    class MyViewController: UIViewController, CLLocationManagerDelegate {
         var locationManager: CLLocationManager!
    
         override func viewDidLoad() {
             super.viewDidLoad()
             locationManager = CLLocationManager()
             locationManager.delegate = self
             locationManager.startHeadingUpdates()
         }
    
    
         override func locationManager(_ manager: CLLocationManager!,
                     didUpdateHeading newHeading: CLHeading!) {
              println("New heading \(newHeading.magneticHeading)")
              // TODO: update your UIViews that draw the compass here.             
         }
    }
    

    这可以帮助您入门,但对于实际应用程序,您可能希望在 viewWillAppear 和 viewDidDisappear 方法中开始和停止航向更新。

    【讨论】:

    • 我收到错误“‘CLLocationManager’没有名为‘startHeadingUpdates’的成员”
    • 我使用了 startUpdatingHeading。到目前为止,我已经使用了您的代码并且没有收到任何错误,但也没有输出。是否需要更新间隔?
    • 我也在尝试这样做,但没有得到任何更新。我也在尝试捕获其他位置信息,我认为这是因为我试图同时做这两件事。但我想不是,因为这对你不起作用。我现在怀疑它与校准有关。
    【解决方案2】:

    您需要确保您的应用已正确请求权限并且 plist 已正确设置

    代码sn-p:

        // don't forget iOS 8 wants the plist value too!
        if (locationManager.respondsToSelector(Selector("requestWhenInUseAuthorization"))) {
            locationManager.requestWhenInUseAuthorization()
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-11
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多