gpt4 book ai didi

ios - 为什么我会收到 fatal error : unexpectedly found nil while unwrapping an Optional value when trying to go to mapView?

转载 作者:行者123 更新时间:2023-11-30 13:19:16 25 4
gpt4 key购买 nike

我正在开发一个应用程序 Witch,它有一个位置列表(由用户添加)和一个 map View ,其中包含一个用于添加用户当前位置的按钮。该应用程序运行到此为止。当用户点击 tableView 中的某个地点时,应用程序应该转到 mapView 并使用 pin 在 map 上显示该地点。但是当我这样做时,应用程序崩溃并给出以下错误,除非用户已重命名该位置,并且如果他们重命名了,则它可以正常工作:

fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)

请注意,崩溃发生在 map View 中的行中:

   let latitude = NSString(string: places[activePlace]["lat"]!).doubleValue

而且

print("activePlace current value is \(activePlace)")

返回TableView中的行号

我该如何解决这个问题?谢谢!

这是TableView中的代码:

import UIKit

var places = [Dictionary<String,String>()]

var activePlace = -1

class TableViewController: UITableViewController {

func companyNameUpdatedAlert(title: String, error: String, indexPath: Int) {

let alert = UIAlertController(title: title, message: error, preferredStyle: UIAlertControllerStyle.Alert)

alert.addTextFieldWithConfigurationHandler { (textField) -> Void in

textField.placeholder = "Enter new text"

}

alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { (action) -> Void in

let lat = places[indexPath]["lat"]!

let lon = places[indexPath]["lon"]!

places.removeAtIndex(indexPath)

places.insert(["name" : alert.textFields![0].text!, "lat" : lat, "lon" : lon], atIndex: indexPath)

self.tableView.reloadData()

NSUserDefaults.standardUserDefaults().setObject(places, forKey: "places")
NSUserDefaults.standardUserDefaults().synchronize()


}))

self.presentViewController(alert, animated: true, completion: nil)


}

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {

let changeText = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Change text" , handler: { (action:UITableViewRowAction, indexPath:NSIndexPath) -> Void in

self.companyNameUpdatedAlert("Update text", error: "enter text below", indexPath: indexPath.row)

})

let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete" , handler: { (action:UITableViewRowAction, indexPath:NSIndexPath) -> Void in

places.removeAtIndex(indexPath.row)

tableView.reloadData()

NSUserDefaults.standardUserDefaults().setObject(places, forKey: "places")
NSUserDefaults.standardUserDefaults().synchronize()

})

return [changeText, deleteAction]


}

override func viewDidLoad() {

//save start

if NSUserDefaults.standardUserDefaults().objectForKey("places") != nil {

places = NSUserDefaults.standardUserDefaults().objectForKey("places") as! [Dictionary]

//test


NSUserDefaults.standardUserDefaults().setObject(places, forKey: "places")
NSUserDefaults.standardUserDefaults().synchronize()



//save stop

super.viewDidLoad()



if places.count == 1 {

places.removeAtIndex(0)

places.append(["name":"go to map to add location","lat":"90","lon":"90"])



}
if NSUserDefaults.standardUserDefaults().objectForKey("places") != nil {

places = NSUserDefaults.standardUserDefaults().objectForKey("places") as! [Dictionary]


}

}
}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

return 1

}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return places.count


}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell

cell.textLabel?.text = places[indexPath.row]["name"]

return cell



}

override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {

activePlace = indexPath.row

return indexPath

}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

if segue.identifier == "newPlace" {

activePlace = -1


}

}

override func viewWillAppear(animated: Bool) {

tableView.reloadData()


}

}

这是 viewController (mapView) 中的代码

   if activePlace == -1 {


manager.requestWhenInUseAuthorization()
manager.startUpdatingLocation()

} else {
print("activePlace current value is \(activePlace)")


let latitude = NSString(string: places[activePlace]["lat"]!).doubleValue

let longitude = NSString(string: places[activePlace]["lon"]!).doubleValue

let coordinate = CLLocationCoordinate2DMake(latitude, longitude)

let latDelta:CLLocationDegrees = 0.01

let lonDelta:CLLocationDegrees = 0.01

let span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)

let region:MKCoordinateRegion = MKCoordinateRegionMake(coordinate, span)

self.Map.setRegion(region, animated: true)

let annotation = MKPointAnnotation()

annotation.coordinate = coordinate

annotation.title = places[activePlace]["name"]

self.Map.addAnnotation(annotation)

print("activePlaces current value is (activePlaces)")

最佳答案

首先,您可以创建自定义类、容器。就像 UserData 一样,包含描述和位置等必需信息。其次,您从框架中免费获得了一个位置 CLLocationCooperative2D 的容器,请使用它。如果您只有简单对象的数组,那么阅读、查找错误和维护应用程序会更容易。

您的错误只是表明您尝试获取的数组元素为零。请记住,在 Swift 数组、字典和其他容器中,是通过值传递的,而不是通过引用传递的,因为它们是结构体!

您的问题出在 prepareForSegue 中,为什么您不将此处选定的项目传递给 destinationViewController?你应该这样做。

附注不要使用 NSUserDefaults.standardUserDefaults() 来存储用户数据。您可以使用 CoreData 代替,它使用起来非常简单。您只需要在 AppDelegate 中添加一些额外代码,并在 TableView 中进行一些更改。

关于ios - 为什么我会收到 fatal error : unexpectedly found nil while unwrapping an Optional value when trying to go to mapView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37926869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com