2013-01-06 40 views
5

के पास निर्देशांक मैं जब एक ViewController दिखाई देता है उपयोगकर्ता के निर्देशांक पाने के लिए कोशिश कर रहा हूँ। मुझे कई दृश्य नियंत्रकों में स्थान की आवश्यकता है, इसलिए मैंने ऐप डिलीगेट में स्थान प्रबंधक को रखा है। मेरी समस्या यह है कि बहुत पहले दृश्य डीडएपियर पर, निर्देशांक अभी तक नहीं मिले हैं। मुझे इसे बदलने के बारे में कैसे जाना चाहिए? आप सभी को धन्यवाद!!!locationManager से AppDelegate में ViewController

- (NSString *)getUserCoordinates 
{ 
NSString *userCoordinates = [NSString stringWithFormat:@"latitude: %f longitude: %f", 
locationManager.location.coordinate.latitude,  locationManager.location.coordinate.longitude]; 
locationManager = [[CLLocationManager alloc] init]; 
locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move 
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m 
[locationManager startUpdatingLocation]; 
return userCoordinates; 
} 

मेरे ViewController इस के साथ निर्देशांक हो जाता है:

मेरे AppDelegate यह है

- (void)viewDidAppear 
{ 
NSString *userCoordinates =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate 
getUserCoordinates]; 
} 

उत्तर

6

मैं हाल ही में AppDelegate में एक ही बात, स्थान प्रबंधक को क्रियान्वित किया है तो मेरे ViewControllers समस्त जानकारी है स्थान डेटा तक पहुंच।

क्रम नया स्थान डेटा प्राप्त करने के लिए CoreLocation प्रतिनिधि तरीकों, विशेष रूप से didUpdateLocations लागू करने के लिए मत भूलना। मैं इसे ऐपडिलेगेट क्लास में रखूंगा।

के बाद से, आप एक रिश्ता जहां एक वस्तु (AppDelegate) एक स्थान अद्यतन के बारे में कई viewControllers सूचित करने के लिए की जरूरत है, मैं NSNotification उपयोग करना चाहिये।

अपने AppDelegate में, आप लिखते थे ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
// set up location manager 
self.locationManager = [[CLLocationManager alloc] init]; 
[self.locationManager setDelegate:self]; 
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
[self.locationManager startUpdatingLocation]; 
return YES; 
} 

- (void)locationManager:(CLLocationManager *)manager 
didUpdateLocations:(NSArray *)locations { 
CLLocation * newLocation = [locations lastObject]; 
// post notification that a new location has been found 
[[NSNotificationCenter defaultCenter] postNotificationName:@"newLocationNotif" 
                  object:self 
                  userInfo:[NSDictionary dictionaryWithObject:newLocation 
                           forKey:@"newLocationResult"]]; 
} 

और अपने ViewController में, आप viewDidAppear विधि का उपयोग नहीं होता। इसके बजाय, आप यह करते हैं कि ...

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// subscribe to location updates 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(updatedLocation:) 
              name:@"newLocationNotif" 
              object:nil]; 
} 

और आप एक विधि updatedLocation इस

-(void) updatedLocation:(NSNotification*)notif { 
CLLocation* userLocation = (CLLocation*)[[notif userInfo] valueForKey:@"newLocationResult"]; 
} 

आप हो सकता है जैसे अन्य viewControllers भी उन्हें पर्यवेक्षकों के रूप में जोड़कर अधिसूचना अपडेट की सदस्यता लग रहा है कि होगा।

+0

बढ़िया काम करता है! धन्यवाद। हालांकि, अधिसूचना पहले ही भेजी जाने के बाद सुनने के लोड लोड के बाद उपयोगकर्ता का प्रारंभिक स्थान मिस जाएगा। मैंने सभी विचारों के उपयोग के लिए स्थान रखने के लिए AppDelegate में चर जोड़ा है। – thedp

+0

@thedp आपने यह कैसे किया ?? क्या आप उस चर के लिए सभी दृश्यों से सुलभ होने के लिए उदाहरण दिखा सकते हैं? –

+0

@UtkuDalmaz मैंने ऐपडिलेगेट में 'CLLocation' चर रखा है और अन्य दृश्य नियंत्रकों से आप इस' appDelegateInst = (AppDelegate *) [[UIAplplication sharedAplication] प्रतिनिधि का उपयोग करते हैं]; '। अब आप ग्लोबल वर्र्स जैसे सभी ऐप डिलीगेट वैरिएबल तक पहुंच सकते हैं। – thedp

0

आप क्या कर सकते हैं CLLocation उपयोगकर्ता के अक्षांश और देशांतर के साथ शब्दकोश के रूप में सहेजने के लिए कुंजीपैथ @ "currentUserLocation" (केवल एक नामकरण) के तहत डिफ़ॉल्ट है।

और अपनी viewDidLoad आप इस तरह मुख्यपथ करने के लिए एक पर्यवेक्षक के रूप में नियंत्रक सेट:

[[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"currentUserLocation" options:NSKeyValueObservingOptionNew context:NULL]; 

और की तरह कुछ को लागू:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 
if ([keyPath isEqualToString:@"currentUserLocation"]) { 

    NSUserDefaults *df = [NSUserDefaults standardUserDefaults]; 
    NSDictionary *dict = [df objectForKey:@"currentUserLocation"]; 
    NSLog(@"yea we have updated location dict %@", dict); 
} 

}

आप कर सकते हैं कि इसका मतलब यह है अपने ऐप में जहां चाहें अपने उपयोगकर्ता स्थान को अपडेट करें और जैसे ही आप UserDefault (मेरे मामले में कीपैथ @ "वर्तमान यूज़र लोकेशन" अपडेट करें) पर्यवेक्षक इसे प्राप्त करेंगे। मुझे लगता है कि एक तरह से एक अधिसूचना केंद्र की तरह इसकी तरह? :)

यह समाधान मेरे मामले के लिए पूरी तरह से काम किया।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^