NSURLSession / NSURLConnection HTTP加载失败,-9802

成功运行程序后,错误将显示在调试区域中

import UIKit import CoreLocation protocol ItemDetailViewControllerDelegate: class { func itemDetailViewControllerDidCancel(controller: ItemDetailViewController) func itemDetailViewController(controller: ItemDetailViewController, didFinishAddingItem item: NoToDoItem) func itemDetailViewController(controller: ItemDetailViewController, didFinishEditingItem item: NoToDoItem) } class ItemDetailViewController: UITableViewController, CLLocationManagerDelegate { @IBAction func myLocation(sender: AnyObject) { self.LocationManager.delegate = self self.LocationManager.desiredAccuracy = kCLLocationAccuracyBest self.LocationManager.requestWhenInUseAuthorization() self.LocationManager.startUpdatingLocation() } let LocationManager = CLLocationManager() @IBOutlet weak var textField: UITextField! @IBOutlet weak var descriptionTextView: UITextView! @IBOutlet weak var doneBarButton: UIBarButtonItem! @IBOutlet weak var dueDateLabel: UILabel! weak var delegate: ItemDetailViewControllerDelegate? var itemToEdit: NoToDoItem? var dueDate = NSDate() var datePickerVisible = false override func viewDidLoad() { super.viewDidLoad() if let item = itemToEdit { title = "Edit Item" textField.text = item.text descriptionTextView.text = item.text dueDate = item.dueDate doneBarButton.enabled = true } updateDueDateLabel() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: { (placemarks, error) -> Void in if (error != nil) { print("Error") return } if let pm = placemarks?.first { self.displayLocationInfo(pm) } else { print("errorData") } }) } func displayLocationInfo(placemark: CLPlacemark){ self.LocationManager.stopUpdatingLocation() print(placemark.locality) print(placemark.postalCode) print(placemark.administrativeArea) print(placemark.country) } func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { print("Error:" + error.localizedDescription) } override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) textField.becomeFirstResponder() } func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { let oldText: NSString = textField.text! let newText: NSString = oldText.stringByReplacingCharactersInRange(range, withString: string) doneBarButton.enabled = (newText.length > 0) return true } @IBAction func done(sender: AnyObject) { if let item = itemToEdit { item.text = textField.text! textField.becomeFirstResponder() item.text = descriptionTextView.text! descriptionTextView.becomeFirstResponder() item.dueDate = dueDate delegate?.itemDetailViewController(self, didFinishEditingItem: item) } else { let item = NoToDoItem() item.text = textField.text! item.dueDate = dueDate delegate?.itemDetailViewController(self, didFinishAddingItem: item) } } @IBAction func cancel(sender: AnyObject) { delegate?.itemDetailViewControllerDidCancel(self) } override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { if indexPath.section == 2 && indexPath.row == 1 { return indexPath } else { return nil } } func updateDueDateLabel() { let formatter = NSDateFormatter() formatter.dateStyle = .MediumStyle formatter.timeStyle = .ShortStyle dueDateLabel.text = formatter.stringFromDate(dueDate) } func showDatePicker() { datePickerVisible = true let indexPathDateRow = NSIndexPath(forRow: 1, inSection: 2) let indexPathDatePicker = NSIndexPath(forRow: 2, inSection: 2) if let dateCell = tableView.cellForRowAtIndexPath(indexPathDateRow) { dateCell.detailTextLabel!.textColor = dateCell.detailTextLabel!.tintColor } tableView.beginUpdates() tableView.insertRowsAtIndexPaths([indexPathDatePicker],withRowAnimation: .Fade) tableView.reloadRowsAtIndexPaths([indexPathDateRow], withRowAnimation: .None) tableView.endUpdates() if let pickerCell = tableView.cellForRowAtIndexPath( indexPathDatePicker) { let datePicker = pickerCell.viewWithTag(100) as! UIDatePicker datePicker.setDate(dueDate, animated: false)} } func hideDatePicker() { if datePickerVisible { datePickerVisible = false let indexPathDateRow = NSIndexPath(forRow: 1, inSection: 2) let indexPathDatePicker = NSIndexPath(forRow: 2, inSection: 2) if let cell = tableView.cellForRowAtIndexPath(indexPathDateRow) { cell.detailTextLabel!.textColor = UIColor(white: 0, alpha: 0.5) } tableView.beginUpdates() tableView.reloadRowsAtIndexPaths([indexPathDateRow], withRowAnimation: .None) tableView.deleteRowsAtIndexPaths([indexPathDatePicker], withRowAnimation: .Fade) tableView.endUpdates() } } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if section == 2 && datePickerVisible { return 3 } else { return super.tableView(tableView, numberOfRowsInSection: section) } } override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { if indexPath.section == 2 && indexPath.row == 2 { return 217 } else { return super.tableView(tableView, heightForRowAtIndexPath: indexPath) } } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // 1 if indexPath.section == 2 && indexPath.row == 2 { // 2 var cell: UITableViewCell! = tableView.dequeueReusableCellWithIdentifier("DatePickerCell") if cell == nil { cell = UITableViewCell(style: .Default, reuseIdentifier: "DatePickerCell") cell.selectionStyle = .None // 3 let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: 320, height: 216)) datePicker.tag = 100 cell.contentView.addSubview(datePicker) // 4 datePicker.addTarget(self, action: Selector("dateChanged:"), forControlEvents: .ValueChanged) } return cell // 5 } else { return super.tableView(tableView, cellForRowAtIndexPath: indexPath) } } func textFieldShouldReturn(textField: UITextField) -> Bool{ textField.resignFirstResponder() return true } func textFieldDidBeginEditing(textField: UITextField) { hideDatePicker() } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { tableView.deselectRowAtIndexPath(indexPath, animated: true) textField.resignFirstResponder() if indexPath.section == 2 && indexPath.row == 1 { if !datePickerVisible { showDatePicker() } else { hideDatePicker() } } } override func tableView(tableView: UITableView, var indentationLevelForRowAtIndexPath indexPath: NSIndexPath) -> Int { if indexPath.section == 2 && indexPath.row == 2 { indexPath = NSIndexPath(forRow: 0, inSection: indexPath.section) } return super.tableView(tableView, indentationLevelForRowAtIndexPath: indexPath) } func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool{ if text == "\n" { descriptionTextView.resignFirstResponder() return false } return true } func dateChanged(datePicker: UIDatePicker) { dueDate = datePicker.date updateDueDateLabel() } } 

您必须在info.plist文件中的NSAppTransportSecurity字典中仅将NSAllowsArbitraryLoads键添加到YES。

例如,

  NSAppTransportSecurity  NSAllowsArbitraryLoads   

在此处输入图像描述