按下自定义UITabBarController上的按钮时显示用户位置

时间:2016-06-24 17:43:34

标签: ios swift dictionary uitabbarcontroller mapbox

我有一个自定义UITabBar控制器,我有按钮在视图控制器之间切换。这是一张图片:  http://i.stack.imgur.com/UInLI.png

我想要的是,当按下主按钮时,视图将变为mapViewController,当再次按下时(在同一个mapViewController上),它将显示给用户位置。

  • 我使用mapBox作为我的Map API,我在mapViewController中有一个函数,
  

findUserLocation()

并使用以下方式显示用户位置:

  

mapView.userTrackingMode = MGLUserTrackingMode.Follow

所以这是我的代码:

class CustomTabBarViewController: UITabBarController {

  override func viewDidLoad() {
    super.viewDidLoad()


    self.tabBar.hidden = true

    let tabBarView = CustomTabBarView()
    tabBarView.viewdidload()
    self.view.addSubview(tabBarView)
    tabBarView.mapButton.addTarget(self, action: #selector(self.changeToMyMap), forControlEvents: UIControlEvents.TouchUpInside)
    // Do any additional setup after loading the view.
}

  func changeToMyMap(){
   if (self.selectedIndex != 0){
   self.selectedIndex = 0 
    }else{
   let mapViewController = myMap()    // the class Name
  mapViewController.mapView.userTrackingMode = MGLUserTrackingMode.Follow
   }
   }
}
  • 因此,当我按下按钮显示用户位置时,我收到错误消息。我想是因为Map没有加载到customTabViewController中,但我不知道如何让它工作。

    当我尝试调用函数时 从我的customTabBarController,我的应用程序出现致命错误。

  

致命错误:在解包可选值时意外发现nil

2 个答案:

答案 0 :(得分:0)

如果您尚未使用它们,则可能是某些helpful mapBox resources

我不确定为什么会因为那里的东西而崩溃 我会尝试放入一些断点来找出它实际崩溃的位置。

尝试在if (self.selectedIndex != 0){ 行上放一个,看看它是否真的进入了该方法。

如果是,请尝试在debug console中输入po yourPropertyName,即po self.selectedIndex,尝试找出返回的属性为无。

此外,如果您知道哪些属性是可选的,请检查您访问它们的位置。这就是他们可能没有的地方。

答案 1 :(得分:0)

在我们的Swift应用程序中,我们使用showsUserLocation来切换用户位置。

如果您只是想显示用户位置,这将是值得尝试的。

Mapbox iOS SDK 3.2.3中的MGLUserTrackingMode用于跟踪地图上的用户位置(例如,跟随行车路线时的体验)。

如何使用showsUserLocation

func changeToMyMap(){
  // not sure if the 'if/else' logic fit with what you intended, but 
  // left your code intact to better highlight how to use mapView.showsUserLocation
   if (self.selectedIndex != 0){   
     self.selectedIndex = 0
       mapViewController.mapView.showsUserLocation = false
   }else{
       let mapViewController = myMap()
       // causes the map view to use the Core Location framework to find the current location
       mapViewController.mapView.showsUserLocation = true
     }
   }
}

请注意Mapbox iOS SDK 3.2.3文档中的这个注释。您需要注意在.plist中设置新密钥。

  

在iOS 8及更高版本中,您的应用必须为其指定值    NSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescription in    其Info.plist以满足底层核心位置的要求    启用此属性时的框架。

enter image description here

比较我们如何在Mapbox中使用showsUserLocation(产生上述GIF的经验) -

    @IBAction func handleSettings(sender: AnyObject) {

    var trackingLocation = UIImage(named: "TrackingLocationOffMask.png")

    switch (self.mapView.userLocationVisible) {
    case true:
        self.mapView.showsUserLocation = false
        trackingLocation = UIImage(named: "TrackingLocationOffMask.png")
        break
    case false:
        self.mapView.showsUserLocation = true
        trackingLocation = UIImage(named: "TrackingLocationMask.png")
        break
    }

     self.navigationItem.leftBarButtonItem?.image = trackingLocation
  }