1

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

视图控制器:0x8a0bcc0

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

我的代码:

UITableView 控制器

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

视图控制器

    [[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 的继承性。不知道为什么通知不起作用,因为他们应该这样做。谢谢大家,非常感谢您的建议和想法:)

4

2 回答 2

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

Object 表示生成通知的对象。要发布参数,请使用另一种方法

[[NSNotificationCenter defaultCenter] postNotificationName:@"Update" object:self userInfo:string]
于 2013-10-17T22:02:17.933 回答
0

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

你需要什么:

1)覆盖-init或这样-initWithNibName:的方法ViewController

-(id) init
{
    self = [super init];
    if (self)
    {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(incomingNotification:) name:@"Update" object:nil];
    }
    return self;
}

因此您可以确定ViewController从一开始就观察通知(嗯​​,这对于您的情况可能是不必要的步骤)

2)当您推送时,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:中创建一个属性UITableViewController

于 2013-10-17T22:45:48.617 回答