2016-03-06 1 views
0

Я пытаюсь создать небольшое приложение для iPad, в котором есть страница «О себе». У меня возникла проблема, когда я пытаюсь изменить класс сцены о странице, который отображается модально, так как приложение выходит из строя, когда пользователь пытается получить доступ к этой странице. Я хочу изменить свой класс на «ViewController», который является тем же классом, что и мое главное окно (вид карты), для создания действий с кнопок на странице «О программе».Смена класса сцены вызывает ошибку, Xcode/Swift

В настоящее время я не могу ctrl + перетащить в .Swift файл со страницы About, если я не изменю его класс. Не знаю, почему это происходит :(

Ошибка выводится на консоль выглядит следующим образом:

fatal error: unexpectedly found nil while unwrapping an Optional value 
0 specialised_fatalErrorMessage(StaticString, StaticString, StaticString, Uint) ->() – 

Вот моя раскадровки со сценами:

enter image description here

Вот полный ViewController .Swift:

import UIKit 
import MapKit 
import CoreLocation 

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate, UISearchBarDelegate, UIPopoverPresentationControllerDelegate { 

    var location: CLLocation! 
    let locationManager = CLLocationManager() 

    // Map variables 
    var searchController:UISearchController! 
    var annotation:MKAnnotation! 
    var localSearchRequest:MKLocalSearchRequest! 
    var localSearch:MKLocalSearch! 
    var localSearchResponse:MKLocalSearchResponse! 
    var error:NSError! 
    var pointAnnotation:MKPointAnnotation! 
    var pinAnnotationView:MKPinAnnotationView! 

    @IBOutlet weak var mapView: MKMapView! 
    @IBOutlet weak var segmentedControl: UISegmentedControl! 
    @IBOutlet weak var showSearchBar: UIBarButtonItem! 
    @IBOutlet weak var addButton: UIBarButtonItem! 
    @IBOutlet weak var moreStuff: UIBarButtonItem!  

    @IBAction func addButton(sender: AnyObject) { 
     let annotation = MKPointAnnotation() 
     annotation.coordinate = CLLocationCoordinate2D(latitude: self.mapView.userLocation.coordinate.latitude, longitude: self.mapView.userLocation.coordinate.longitude) 
     self.mapView.addAnnotation(annotation) 
     self.locationManager.startUpdatingLocation() 

    } 

    @IBAction func showSearchBar(sender: UIBarButtonItem!) { 
     searchController = UISearchController(searchResultsController: nil) 
     searchController.hidesNavigationBarDuringPresentation = false 
     self.searchController.searchBar.delegate = self 
     presentViewController(searchController, animated: true, completion: nil) 

    } 

    @IBAction func moreStuff(sender: AnyObject) { 
     self.performSegueWithIdentifier("showMoreStuff", sender:self) 
    } 


    @IBAction func refresh(sender: AnyObject) { 

     self.locationManager.startUpdatingLocation() 
    } 

    @IBAction func segmentedControl(sender: UISegmentedControl!) { 

     if sender.selectedSegmentIndex == 0{ 

      mapView.mapType = MKMapType.Standard 
     } 
     else if sender.selectedSegmentIndex == 1{ 

      mapView.mapType = MKMapType.Satellite 
     } 
     else if sender.selectedSegmentIndex == 2{ 

      mapView.mapType = MKMapType.Hybrid 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.locationManager.delegate = self 

     self.locationManager.desiredAccuracy = kCLLocationAccuracyBest 

     self.locationManager.requestWhenInUseAuthorization() 

     self.locationManager.startUpdatingLocation() 

     self.mapView.showsUserLocation = true 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 

// location delegate methods 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

    let location = locations.last 

    let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude) 

    let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)) 

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

    self.locationManager.stopUpdatingLocation() 

} 

func locationManager(manager: CLLocationManager, didFailWithError error: NSError) 
{ 
    print("Error code: " + error.localizedDescription) 
} 

func searchBarSearchButtonClicked(searchBar: UISearchBar){ 

    searchBar.resignFirstResponder() 
    dismissViewControllerAnimated(true, completion: nil) 
    if self.mapView.annotations.count != 0{ 
     annotation = self.mapView.annotations[0] 
     self.mapView.removeAnnotation(annotation) 
    } 

    localSearchRequest = MKLocalSearchRequest() 
    localSearchRequest.naturalLanguageQuery = searchBar.text 
    localSearch = MKLocalSearch(request: localSearchRequest) 
    localSearch.startWithCompletionHandler { (localSearchResponse, error) -> Void in 

     if localSearchResponse == nil{ 
      let alertController = UIAlertController(title: nil, message: "No Such Place", preferredStyle: UIAlertControllerStyle.Alert) 
      alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default, handler: nil)) 
      self.presentViewController(alertController, animated: true, completion: nil) 
      return 
     } 

     self.pointAnnotation = MKPointAnnotation() 
     self.pointAnnotation.title = searchBar.text 
     self.pointAnnotation.coordinate = CLLocationCoordinate2D(latitude: localSearchResponse!.boundingRegion.center.latitude, longitude:  localSearchResponse!.boundingRegion.center.longitude) 


     self.pinAnnotationView = MKPinAnnotationView(annotation: self.pointAnnotation, reuseIdentifier: nil) 
     self.mapView.centerCoordinate = self.pointAnnotation.coordinate 
    } 
} 

} 

Я новичок в Swift поэтому любая помощь действительно ценится. Благодаря!

Edit: Это экран ошибки представила мне однажды аварии приложения: enter image description here

ответ

0

Я не использовал MapKit, но я до сих пор стараюсь.

Глядя на вашу ошибку, вы получаете ничтожный крах, который указывает, что одно из ваших свойств - ноль, но вы пытаетесь его использовать.

Имея быстрый прочитать код швы вы не инициализирован

var localSearchResponse.... 

Опять же я не знаю МК API очень хорошо, поэтому я не 100 уверен, что я говорю, имеет отношение.

Вы проверили, что все ваши IBOutlets подключены правильно?

На какой линии вы получаете сбой, когда это происходит? Вы получаете сбой до или после перехода на страницу abouts?

+0

Большое спасибо за ваш ответ, как бы инициализировать localSearchResponse? Я думаю, что каждая розетка правильно подключена, но я не уверен на 100%. Это не говорит мне, какая строка из файла .swift содержит ошибку, она просто показывает мне, что я написал выше в моем вопросе. Он выходит из строя, когда пользователь нажимает кнопку «О» на всплывающем меню, расположенном над видом карты. Ps Я обновил свой вопрос с экрана ошибки, представленным после сбоя приложения. – Oscar

+0

Возможно, похоже на то, как вы запускаете другие свойства, например localSearchResponse = MKLocalSearchResponse(). Кнопка ShowMoreStuff о кнопке? – crashoverride777

+0

Я думаю, что нашел строку ошибки, здесь, в фонде viewDidLoad: self.mapView.showsUserLocation = true. showMoreStuff - это кнопка в меню popover, содержащее кнопку About page – Oscar