2014-05-04 76 views
0

在我使用故事板的應用程序中,我在mainViewController中使用MapView。在mainViewController的頂部,我使用UITableViewController從屏幕底部顯示UIContainerView。當用戶點擊行時,我將通知發送到mainViewController,以便通過動畫更改地圖區域。當用戶選擇特定的tableViewCell時以及用戶點擊位於navigationViewController中的按鈕時,也會發送類似的通知。除了在DONE按鈕方法中調用的方法之外,一切正常。多個NSNotificationCenter問題

主視圖控制器 - (無效)viewDidLoad方法...

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideContainerView:) 
              name:HideContainerView object:self]; 


[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeRegionForUser:) 
              name:ChangeRegionForUser 
              object:nil]; 


[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideContainerView:) 
              name:ChangeRegionToInitial 
              object:nil]; 


[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeRegionToFitWearerAnnotations:) 
              name:ChangeRegionToFitWearerAnnotations 
              object:nil]; 

主視圖控制器觀察員方法:

#pragma mark NSNotificationCenter methods 
-(void)changeRegionForUser:(NSNotification*)notification 
{ 
NSLog(@"%@",notification.description); 
[self zoomToFitUserLocationWithLatitude:-33.861858 longitude:151.210546 andUserInfo:nil]; 
} 
-(void)hideContainerView:(NSNotification*)notification 
{ 
NSLog(@"%@",notification.description); 

[self zoomToFitMapAnnotations:_mainMapView]; 
[UIView beginAnimations:@"HideContainerAnimation" context:nil]; 
[UIView setAnimationDuration:0.5]; 
[_containerView setFrame:CGRectMake(0, 600, 320, 284)]; 
[UIView commitAnimations]; 
} 
-(void)changeRegionToFitWearerAnnotations:(NSNotification*)notification 
{ 
NSLog(@"%@",notification.description); 

[self zoomAnnotationsOnMapView:_mainMapView toFrame:CGRectMake(0, 0, 320, 200) animated:YES]; 
} 

表視圖控制器( DID-SELECT-ROW-AT-INDEX-PATH方法)/ /它正常工作

[[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeRegionForUser" object:self]; 

表視圖控制器(DONE按鍵法)//這是行不通的

-(void)doneButtonAction:(id)sender 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"HideContainerView" object:self]; 
} 

enter image description here我的故事板

主VIEW CONTROLLER.H

@interface MainScreenViewController : UIViewController<MKMapViewDelegate> 
extern NSString * const HideContainerView; 
extern NSString * const ChangeRegionForUser; 
extern NSString * const ChangeRegionToInitial; 
extern NSString * const ChangeRegionToFitWearerAnnotations; 

主VIEW Controller.m或者

#import "MainScreenViewController.h" 
NSString* const HideContainerView = @"HideContainerView"; 
NSString* const ChangeRegionForUser = @"ChangeRegionForUser"; 
NSString* const ChangeRegionToInitial = @"ChangeRegionToInitial"; 
NSString* const ChangeRegionToFitWearerAnnotations [email protected]"ChangeRegionToFitWearerAnnotations"; 
+0

你可以發佈你的項目?任何使用NSNotificationCenter的最佳實踐都是viewWillAppear上的addOserver和ViewController上的viewWillDisappear上的removeObserver。 –

+0

當然,我知道,但TableViewController顯示在UIContainer中,並始終處於活動狀態。我不確定viewWillDisappear方法是否會改變我的情況。不幸的是我不能發佈我的項目,但我可以上傳一些方法,如果你想... – sonoDamiano

+0

在這一行([[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideContainerView :) name:HideContainerView object:self];)是HideContainerView字符串常量?你在哪裏定義了它? –

回答

0

您使用一個字符串,因爲當你自己添加作爲觀察員通知名稱不變HideContainerView。但是,當您發佈通知時,您使用的是字符串@"HideContainerView"。也許你在那裏使用兩個不同的字符串?

此外,我認爲當您將自己添加爲觀察者時,您正在使用self作爲object。看來這阻止了接收通知。從文檔:

notificationSender
的對象,其通知觀察者要接收;也就是說,只有該發件人發送的通知纔會發送給觀察者。 如果您通過零,通知中心不會使用通知的發件人來決定是否將其發送給觀察者。

改爲使用nil

這就是說,將這兩個控制器更緊密地聯繫起來會不會更好。我認爲這將是一個更合適的設計。當發送者不知道接收者是否存在時,你應該發送通知。但在這種情況下,您知道接收器存在。

因此,您應該實現一個簡單的委託協議,保留對地圖視圖控制器的引用並直接告訴它該做什麼。

+0

不,我檢查了100次,但謝謝你的建議。 – sonoDamiano

+0

看我的編輯。我想你應該和代表一起去。 – Mundi

+0

看看我的故事板,並試圖解釋我如何實現這個委託? – sonoDamiano