发布通知时发生NSInvalidArgumentException

时间:2011-05-03 10:17:29

标签: cocoa-touch uiviewcontroller notifications uisplitviewcontroller ipad

我正在尝试使用通知系统,以便在Splitviewcontroller中获得详细信息视图以更新tableview。我宣布通知如下:

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

和选择器本身:

- (void) pushView:(UIViewController *) viewController {
    [self.navigationController pushViewController:viewController animated:YES];
}

现在,在详细视图中,我创建了视图控制器并调用创建通知:

   ArticleTableViewController *articleTableView  = [[ArticleTableViewController alloc] initWithCategory:catInt];

   [[NSNotificationCenter defaultCenter] postNotificationName:@"pushView" object:articleTableView];

我认为这样可行,但我收到了错误:

  

* 由于未被捕获而终止应用   例外   'NSInvalidArgumentException',原因:   “ - [NSConcreteNotification   setParentViewController:]:   无法识别的选择器发送到实例   0x5a3a290'

所以我想我在如何在用于推送的通知中包含detailViewController时做错了。

1 个答案:

答案 0 :(得分:5)

处理通知的方法定义似乎是错误的。

- (void) pushView:(UIViewController *) viewController

应该是,

- (void) pushView:(NSNotification *) notification

实际通知作为参数传递,而不是任何视图控制器。要实现您的目标,请尝试以下方法。

- (void) pushView:(NSNotification *) notification

    NSDictionary *userInfo = [notification userInfo];
    UIViewController *viewController = (UIViewController *)[userInfo objectForKey:@"ViewController"];
    [self.navigationController pushViewController:viewController animated:YES];
}

在发布通知时,

    ArticleTableViewController *articleTableView  = [[ArticleTableViewController alloc] initWithCategory:catInt];
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:articleTableView forKey:@"ViewController"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"pushView" object:nil userInfo:userInfo];