将具有NSNotificationCenter的对象传递给其他视图

时间:2011-11-22 20:31:39

标签: iphone xcode nsnotifications nsnotificationcenter

我正在尝试将一个对象从我的主视图类传递到另一个类中的其他通知接收器。

我想传递一个名为country的对象,它从主控制器中的SOAP请求加载所有城市,我想将它发送到我的下一个视图。

  

country = [[Country alloc] init];

国家标题:

@interface Country : NSObject
{
    NSString *name;
    NSMutableArray *cities;
}

@property (nonatomic,retain) NSString *name;

- (void)addCity:(Cities *)city;
- (NSArray *)getCities;
- (int)citiesCount;    
@end

我发现使用NSNotificatios传递数据的方法是在UserInfo中使用NSDictionary。但它不可能发送整个对象而不是转换为NSDictionary?或者转移它的最佳方式是什么?我试图弄清楚如何传递物体。

实际上我在我的应用程序上运行了这个简单的NSNotification。

主视图控制器实现中的NSNotification:

//---Call the next View---
DetailViewController *detail = [self.storyboardinstantiateViewControllerWithIdentifier:@"Detail"];
[self.navigationController pushViewController:detail animated:YES]; 

//--Transfer Data to2View 
[[NSNotificationCenter defaultCenter] postNotificationName:@"citiesListComplete" object:nil];

2View Controller实施中的NSNotification:

 // Check if MSG is RECEIVE
- (void)checkMSG:(NSNotification *)note {

    NSLog(@"Received Notification");
}

- (void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(checkMSG:) 
                                                 name:@"citiesListComplete" object:nil];

2 个答案:

答案 0 :(得分:25)

Oooooo,太近了。我有一种感觉,你不明白NSDictionary是什么。

发布您的通知:

Country *country = [[[Country alloc] init] autorelease];
//Populate the country object however you want

NSDictionary *dictionary = [NSDictionary dictionaryWithObject:country forKey:@"Country"];

[[NSNotificationCenter defaultCenter] postNotificationName:@"citiesListComplete" object:nil userInfo:dictionary];

然后获取这样的国家/地区对象:

- (void)checkMSG:(NSNotification *)note {

    Country *country = [[note userInfo] valueForKey:@"Country"];

    NSLog(@"Received Notification - Country = %@", country);
}

您无需将对象转换为NSDictionary。相反,您需要使用您的对象发送NSDictionary。这样,您就可以根据NSDictionary中的密钥和NSNotification一起发送大量信息。

答案 1 :(得分:4)

对于Swift 您可以使用以下代码

传递字典
NSNotificationCenter.defaultCenter().postNotificationName(aName: String, object anObject: AnyObject?, userInfo aUserInfo: [NSObject : AnyObject]?)

例如

NSNotificationCenter.defaultCenter().postNotificationName("OrderCancelled", object: nil, userInfo: ["success":true])

读取这本词典
 func updated(notification: NSNotification){

         notification.userInfo?["success"] as! Bool 
    }