NSNotificationCenter,打印内存地址

时间:2013-10-17 19:27:29

标签: ios objective-c nsnotificationcenter nslog

我的应用程序中有一个UITableview Controller,一个View Controller,我正在尝试使用NSNotificationCenter将NSDictionary从UITableview Controller传递给我的ViewController。所以,我在我的UITableview控制器上发送通知,然后在我的ViewController上使用选择器添加一个观察者。调用选择器,但我有一个NSLog并获得内存结果,如:

  

ViewController:0x8a0bcc0

我试图传递NSString而不是NSDictionary,但我再次得到内存结果,而不是字符串的值。

我的代码:

UITableView控制器

    NSString *string=@"This is a test string";
    [[NSNotificationCenter defaultCenter] postNotificationName: @"Update" object: string];

的ViewController

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"Update" object:nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self];

这是incomingNotification选择器方法:

-(void) incomingNotification : (NSNotification *)notification{
    NSLog(@"Trying to print : %@",[notification object]);
}

所有通知都在ViewDidLoad方法进行。谢谢!

更新

最后,我退出使用NSNotificationCenter并使用属性传递数据,从我的TableViewController改变了一点点。不知道为什么通知不起作用,正如他们应该的那样。非常感谢大家的建议和想法:)

2 个答案:

答案 0 :(得分:1)

[[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self]

对象表示生成通知的对象。要发布参数,请使用其他方法

[[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self userInfo:string]

答案 1 :(得分:0)

如果我理解正确,点击UIViewController上的按钮后会显示UITableViewController。如果您要在其ViewController中添加-viewDidLoad:作为观察者,那么只有在加载时才会收到通知。

你需要什么:

1)覆盖-init的{​​{1}}或-initWithNibName:方法,如下所示:

ViewController

所以你可以确保-(id) init { self = [super init]; if (self) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"Update" object:nil]; } return self; } 从一开始就观察通知(对你的情况来说,这可能是不必要的步骤)

2)当您按ViewController时,您需要在创建后发送通知,如下所示:

ViewController

但是,如果您只是尝试将一些参数从一个视图控制器发送到另一个视图控制器,这是错误的方法。只需在-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ViewController *nextController = [[ViewController alloc] initWithNibName:nil bundle:nil]; [self.navigationController pushViewController:nextController animated:YES]; NSString *string=@"This is a test string"; [[NSNotificationCenter defaultCenter] postNotificationName: @"Update" object: string]; } 中创建一个属性,并在ViewController的方法-tableView:didSelectRowAtIndex:中设置此属性