[英]best way to use CoreLocation across multiple views
我的應用程序中有兩個視圖,一個是一般視圖,其中CoreLocation在用戶在視圖中執行其他操作時計算用戶位置。 用戶在觸摸按鈕時訪問第二個視圖,允許他們使用mapview和MapKit更准確地定位自己,我希望此視圖中的mapview顯示CoreLocation已在第一個視圖中識別的位置並繼續根據另一個視圖中CoreLocation的更新顯示此位置。
這是創建封裝CoreLocation內容的單例並在視圖中使用地圖引用或使用通知的最佳方法嗎? 或者為我的場景使用其他一些更好的練習?
謝謝
我有幾個在多個地方使用CoreLocation
的應用程序。 從我讀過的內容來看,你肯定希望只有一個CLLocationManager
實例。 它對我來說是一個很好的單身人士。
希望這可以幫助!
如果我是你,我會這樣做:
決定始終加載哪個視圖。 我假設,您希望一直加載CalculatingView ,並根據用戶操作加載/卸載MapView 。
在CalculatingView中分配並初始化指向CLLocationManager的指針。 這將提供位置屬性並調用委托消息。 由於加載並保留了CalculatingView ,因此該指針也始終有效。
如果此視圖已分配並初始化CLLocationManager指針,則將CLLocationManager的委托設置為CalculatingView ,也可稱為self 。
在CalculatingView中實現CLLocationManager的委托方法
如果您願意,可以在CalculatingView中分配和初始化MapView 。 但只要你可以向MapView發送消息,就可以在其他地方使用它。 通過檢查它是否為零或是否響應ToSelector來確保它們有效。
當CLLocationManager的委托(即CalculatingView)接收消息時,向MapView發送消息。
這就像轉發消息一樣,但MapView應該響應的消息不必是發送到CalculatingView的相同消息,就像來自CLLocationManager的委托方法調用一樣
通過檢查MapView是否有效,這意味着如果它被加載以顯示,您可以決定是否向MapView發送消息
本質是決定哪個視圖是否被加載,使用委托方法將消息發送(或中繼)到其他指針(在本例中為MapView指針)。
單身是好的,但除非你要從多個地方使用CLLocationManager ,比如超過3~4個地方,我認為沒有必要
希望我沒有混淆你。 根據您發布的內容,這種方式似乎可以為您的目標提供簡單的解決方案。 如果我沒有抓住你的真實意圖,請告訴我。
我不確定這是最好的方法,但我一直在設置我的主控制器(首先加載的控制器)作為位置管理器代表。 當位置更新時,它會以新位置作為通知對象觸發通知。 然后,任何偵聽控制器都可以使用該數據,但需要它們。
另外,Apple的LocateMe應用程序實例化了三次位置管理器。 因此,通過他們的例子,擁有多個LocationManagers可能不是問題。
根據我的閱讀,最佳做法是將CLLocationManager
添加到App Delegate
因為您可以從任何視圖訪問它。
簡短的示例代碼放在您需要CLLocationManager的視圖中
....imports....
@implementation YourViewController
- (void)viewDidLoad {
self.myLocationManager = [[UIApplication sharedApplication] delegate].yourLocationManagerVarName;
}
@end
跳幫助。
也許你應該考慮一種面向MVC的方法。 根據您的描述,您缺少用戶的模型層表示。 使用基本CLLocation屬性定義一個簡單的User類將是第一步。
@interface User {}
@property (nonatomic, retain) CLLocation *location;
@end
@implementation User
@synthesize location;
- (void)dealloc {
self.location = nil;
[super dealloc];
}
@end
用戶的同一實例將傳遞給您的視圖控制器。 它可以在app委托中創建。
接下來為您的應用創建位置服務對象。 它將啟動CLLocationManager,並將位置提供給您的用戶。 您可能必須設置GPS准確度,忽略您不想要的幀,並在此處實現基本LBS邏輯。
此時,您有一個功能完整的應用程序,沒有任何UI。 這是一種可以重復使用和測試的好設計。
現在將您的UI疊加在其上。 為您的根控制器提供指向應用程序委托中的User實例的指針。 視圖控制器將此指針傳遞給它創建的模態/導航視圖控制器。
該控制器開始在viewDidLoad中觀察用戶的位置變化並做出相應的反應。
- (void)viewDidLoad {
[self observeValueForKeyPath:@"location" ofObject:self.user change:0 context:NULL];
}
您的視圖控制器還會注冊您的位置服務對象引發的通知,以向用戶顯示警報。
基於其他答案:
如果您需要更多代碼,請詢問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.