2015-10-14 1 views
1

Итак, моя текущая проблема заключается в следующем.Как использовать один и тот же диспетчер представлений, но передавать через него другую информацию?

Я хотел бы по существу использовать мой текущий диспетчер представлений, но изменить настройки местоположения где-то еще в приложении и передать данные через диспетчер представлений с обновленной информацией о местоположении.

Я подробно рассмотрю. В настоящее время я использую следующий код для обратного геокодирования и получения местоположения пользователей.

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

    locationManager.stopUpdatingLocation() 

    if(locations.count > 0){ 


     let location = locations[0] as! CLLocation 

     //   println(location.coordinate) 


     if let currentLocatino = currLocation { 
      if CLLocation(latitude: currentLocatino.latitude, longitude: currentLocatino.longitude).distanceFromLocation(location) > 500 { 
       currLocation = location.coordinate 
       self.skip = 0 
       self.loadObjects() 

      } 
     } 
     else { 
      currLocation = location.coordinate 
      self.skip = 0 
      self.loadObjects() 
     } 


     CLGeocoder().reverseGeocodeLocation(CLLocation(latitude: currLocation!.latitude, longitude: currLocation!.longitude), completionHandler: {(placemarks, error) -> Void in 


      if error != nil { 
       println("Reverse geocoder failed with error" + error.localizedDescription) 
       return 
      } 

      if placemarks.count > 0 { 
       let date = NSDate() 
       let formatter = NSDateFormatter() 
       formatter.dateStyle = .MediumStyle 
       formatter.stringFromDate(date) 
       let pm = placemarks[0] as! CLPlacemark 


       var testifempty = "\(pm.subLocality)" 
       if testifempty == "nil" 
       { 
        self.locationManager.startUpdatingLocation() 
        if let lbutton = self.lbutton{ 
         lbutton.text = "Hey " + "\(pm.locality)" //+ "\n" + formatter.stringFromDate(date) 


        } 

       } 
       else 
       { 
        self.locationManager.startUpdatingLocation() 
        if let lbutton = self.lbutton { 
         lbutton.text = "Hey " + "\(pm.subLocality)\n" // + formatter.stringFromDate(date) 
        } 

       } 
      } 

      else { 
       println("Problem with the data received from geocoder") 
      } 
     }) 

    } else { 


     println("Cannot fetch your location") 

    } 

} 

То, что я хотел, это, по существу, пройти через новое место и логического рода, так что, если указанный булев установлено значение лжи, информация о новом местоположении передается через приложение.

Я думаю об использовании переключателя на главном контроллере просмотра и изменении местоположения на дополнительном контроллере просмотра.

Прошу прощения, если это длинный пост, но я чувствую, как будто я нахожусь на грани выяснения, как это сделать, но я должен быть уверен, что пойду в правильном направлении.

Возможно, я мог бы использовать mapkit и использовать аннотации?

ответ

0

Я бы не рекомендовал использовать какой-либо тип для передачи или хранения информации. Коммутатор (например, UISwitch) должен представлять некоторые другие данные графически для пользователя.

Если вы новичок в разработке мобильных устройств, я бы рекомендовал взглянуть на шаблон проектирования MVC. Here, являются couple разными resources, чтобы вы начали с этого.

Если вам нужно сохранить некоторые данные в своем приложении, к которым вы можете получить доступ из любого класса (viewController, view, custom object и т. Д.), То Singleton - отличное решение. Вы можете иметь картографические данные, которые доступны для всего приложения, вы можете хранить переменные и иметь возможность повторно назначать их из других классов, и вы всегда получаете только один экземпляр, чтобы ваши логические провода никогда не пересекались.

Singletons пользуются довольно часто, поэтому я бы рекомендовал посмотреть, как выглядит код реализации и познакомиться с ним. Here's a brief example of an implementation.

0

Для вашей проблемы шаблон делегирования представляется наиболее подходящим.

Если вы создаете протокол для вашего основного контроллера представлений, который объявляет метод для обновления своих данных, например locationDidUpdate:, тогда основной контроллер представления можно установить в качестве делегата контроллера вторичного представления. Контроллер вторичного представления может затем вызвать этот метод делегата и обновить контроллер первичного представления новыми данными.

В качестве примера, протокол может быть объявлен в первом контроллере представления, как:

protocol LocationViewControllerDelegate: class { 
    func locationDidUpdate(location: CLLocation) 
} 

Тогда есть свой дополнительный контроллер представления соответствуют протоколу и создать свойство делегата:

weak var delegate: LocationViewControllerDelegate? 

Когда вам нужно обновить местоположение, вызовите метод делегирования с помощью:

delegate.locationDidUpdate(myNewLocation) 

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

+0

Да, это очень хороший маршрут, не слишком сложный. Я дам вам знать, как это происходит, и у меня, вероятно, еще несколько вопросов. –

+0

У меня уже есть вопрос, где бы я поместил метод делегата, в первый контроллер? –

+0

@JamesChen, да, вы можете объявить свой протокол в своем первом контроллере. – Daniel

Смежные вопросы