我如何使用相同的viewcontroller,但通过它传递不同的信息?

时间:2015-10-14 22:47:38

标签: ios swift uitableview core-location

所以,我目前的问题如下。

我想基本上使用我当前的viewcontroller,但是在应用程序中的其他位置更改位置设置,并让数据通过viewcontroller传递更新的位置信息。

我会详细说明。我目前正在使用以下代码进行反向地理编码,并获取用户位置。

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")

    }

}

我想要的是,它本质上是通过一个新位置并设置一个布尔类型,以便如果所述布尔值设置为false,则新的位置信息将通过该应用程序传递。

我正在考虑在主视图控制器上使用开关,并在辅助视图控制器上更改位置。

我很抱歉,如果这是一个很长的帖子,但我觉得我正好在弄清楚如何做到这一点,但我需要确保我正朝着正确的方向前进。

也许我可以使用mapkit并使用注释?

2 个答案:

答案 0 :(得分:0)

我不建议使用任何类型的视图来传递或保存信息。交换机(如UISwitch)应以图形方式为用户表示其他一些数据。

如果您不熟悉移动开发,我建议您查看MVC设计模式。 Here,与couple不同resources,可以帮助您开始。{/ p>

如果您需要在应用中的某个位置保留一些可以从任何类(viewController,view,custom object等)访问的数据,那么Singleton将是一个很好的解决方案。您可以在整个应用程序中访问可以访问的地图数据,您可以存储变量并能够从其他类重新分配它们,并且您最终只能使用一个实例,因此您的逻辑线永远不会越过。

单身人士经常使用,因此我建议您查看实施代码的外观并熟悉它。 Here's a brief example of an implementation

答案 1 :(得分:0)

对于您的问题,委派模式似乎是最合适的选择。

如果为主视图控制器创建一个声明更新其数据的方法(例如locationDidUpdate:)的协议,则可以将主视图控制器设置为辅助视图控制器的委托。然后,辅助视图控制器可以调用此委托方法并使用新数据更新主视图控制器。

例如,可以在第一个视图控制器中声明协议,如:

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

然后让您的辅助视图控制器符合协议并创建委托属性:

weak var delegate: LocationViewControllerDelegate?

当您需要更新位置时,请使用以下命令调用委托方法:

delegate.locationDidUpdate(myNewLocation)

通常,拥有用于管理基于事件的更新的协议是一个优势,因为它提供了一个可以由其他类轻松实现的明确合同。