ios - 解包可选值时发现 nil

标签 ios swift uitabbarcontroller mapkit option-type

首先让我感谢您的关注。非常感谢您提供的任何帮助,因为我在谷歌搜索一小时后陷入困境。

切换到选项卡栏 Controller 后,我的 mkMapView 返回 nil,标题中出现错误。这对我来说没有意义,因为处理 mkMapView 的同一个类以前工作得很好。由选项卡栏管理的所有其他 View Controller 都按预期工作。当我尝试设置委托(delegate)时会发生错误(因为 mapView 似乎总是返回 nil)。我已经尝试删除 mapView 并创建新的 socket 连接,但这也不起作用。

这是控制台中发布的错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

感谢您提供的任何帮助。

这是我更改为包含自定义选项卡栏 Controller 的类:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window!.makeKeyAndVisible()


        let EYBar:EYTabBar = EYTabBar(icons: ["ic_search_white_36pt","ic_star_white_36pt","ic_message_white_36pt","form", "ic_settings_white_36pt"])

        let tab1:ListViewController = ListViewController()
        let nav1:UINavigationController = UINavigationController(rootViewController: tab1)

        let tab2:MapSearchVC = MapSearchVC()
        let tab3:ViewController = ViewController()
        tab3.view.backgroundColor = UIColor.darkGrayColor()
        let tab4:ViewController = ViewController()
        tab4.view.backgroundColor = UIColor.cyanColor()

        EYBar.viewControllers = [nav1,tab2,tab3,tab4]
        EYBar.EYTabbarView.backgroundColor = UIColor(red: 63/255, green: 81/255, blue: 181/255, alpha: 1.0)
        EYBar.selectedView.backgroundColor = UIColor(red: 48/255, green: 63/255, blue: 159/255, alpha: 1.0)


        self.window!.rootViewController = EYBar
        return true


    }

这是旧的应用程序委托(delegate):

 var storyboard = UIStoryboard(name: "Main", bundle: nil)

        let mainViewController = storyboard.instantiateViewControllerWithIdentifier("MapSearchVC") as! MapSearchVC
        let leftViewController = storyboard.instantiateViewControllerWithIdentifier("LeftViewController") as! LeftViewController
        let rightViewController = storyboard.instantiateViewControllerWithIdentifier("RightViewController") as! RightViewController
        let mapSearchVC = storyboard.instantiateViewControllerWithIdentifier("MapSearchVC") as! MapSearchVC

        let nvc: UINavigationController = UINavigationController(rootViewController: mainViewController)

        leftViewController.mapViewController = nvc



        let slideMenuController = SlideMenuController(mainViewController: nvc, leftMenuViewController: leftViewController, rightMenuViewController: rightViewController)
        self.window?.rootViewController = slideMenuController
        self.window?.backgroundColor = UIColor.grayColor()
        self.window?.makeKeyAndVisible()

这是管理 View Controller 和 map View 的类(没有进行任何更改,但这就是 xCode 抛出错误的地方(这是唯一有问题的 View Controller ):

class MapSearchVC: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate{
    var locationManager = CLLocationManager()

    @IBOutlet weak var mapView: MKMapView!
    var listings = [masterProperty]()
    let actionButton = MKButton()
    let navTitle = UILabel(frame: CGRectMake(65, -2.5, 70, 44))
    let navMenuView = UIImageView(frame: CGRectMake(0, 0, 60, 44))
    let navIcon = UIImage(named: "ic_menu_white_24dp")


    override func viewDidLoad() {
        super.viewDidLoad()

        navTitle.text = "Search"
        navTitle.textColor = UIColor.whiteColor()
        navTitle.font = UIFont(name: "Roboto-Regular", size: 20)
        self.navigationController?.navigationController?.navigationBar.addSubview(navTitle)


        navMenuView.image = navIcon
        navMenuView.contentMode = UIViewContentMode.ScaleAspectFill

        //self.navigationController?.navigationController?.navigationBar.addSubview(navMenuView)


        // Do any additional setup after loading the view, typically from a nib.
        var authStatus = CLLocationManager.authorizationStatus()
        locationManager.delegate = self
        getAllListings()
        mapView.addAnnotations(listings)
        mapView.delegate = self

最佳答案

我之前遇到过同样的问题。

@IBOutlet weak var mapView: MKMapView! 更改为 @IBOutlet var mapView: MKMapView!

因为 mapView 的弱变量有时会导致它崩溃。

我还实现了检查,查看搜索结果是否返回 nil

if localSearchResponse == nil || self.mapView == nil{
                var alert = UIAlertView(title: nil, message: "Place not found", delegate: self, cancelButtonTitle: "Try again")
                alert.show()
                return
            } 

这些东西让它为我工作。我不知道为什么。但我认为,如果搜索需要很长时间才能获取/执行,它会同时丢失 mapView,因为它是一个weak var

关于ios - 解包可选值时发现 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30882692/

相关文章:

iphone - NSFetchedResultsChangeUpdate 被触发而不是 NSFetchedResultsChangeDelete

iOS 在状态栏上隐藏时间

swift - 在 UITableViewCell 中按下按钮后获取 NSManagedObject 的一个属性

swift - 从 UIButton 触摸触发 UITabbarController 操作

swift - UIStoryboard 中的 iOS 8 自定义选项卡栏 Controller

ios - 将标题设置为 UIBarButtonItem

ios - 从选择的 UISegmentedControl 段中获取字符串值

ios - AVPlayer 帧动画

ios - 快速将没有 nib 文件的现有 UIViewControllers 添加到 UITabBarController

ios - 所有资源的正常大小和@2x 大小?