NSNotification错误

3

我似乎在NSNotification上卡住了,原因不明。

我在一个IBAction按钮方法中发布一个通知。当用户点击该按钮时,我希望能够收到通知,以便我可以在文本字段中设置文本。如果没有他们点击按钮,NSString仍将为空 - 这就是为什么我需要知道他们何时这样做的原因。

因此,在按钮方法中,我有以下代码:

- (IBAction)suggestionsButton:(UIButton *)sender {

    self.usernameSelected = sender.titleLabel.text;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"UserTappedButton" object:self];
}

这是在UITableviewCell类中。

然后我在负责此操作的视图控制器中添加观察者:

 (void)viewDidLoad
{
    [super viewDidLoad];

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

我已经检查了以下内容:

  1. 观察者方法先于发布方法被调用(是的)
  2. 两种方法的名称都正确
  3. 选择器签名正确

我还查看了一些SO答案,但没有帮助。

各位,我是否遗漏了什么?

*更新 *

抱歉 - 我想调用的方法如下:

-(void)userPickedAuserNameFromSuggestion: (NSNotification *)notification
{
    NSLog (@"Selected Username: %@", self.usernameCell.usernameSelected);

}

然而它没有被调用。

你能展示一下你的方法吗 - userPickedAuserNameFromSuggestion - rishi
1
viewWillAppear 中使用 addObserver:,在 viewWillDisappear 中使用 removeObserver: - Akhilrajtr
谢谢。不过,遗憾的是这并没有解决问题。 - Robert J. Clegg
尝试过了,还是没有用。我打算删除所有的代码,重新输入一遍。也许我在某个地方拼错了什么。感谢您的建议。 - Robert J. Clegg
好的 - 把所有东西都重写了,但还是没有解决问题。然后根据@Akhilrajtr的建议重新把它添加到viewWillAppear中,现在它可以工作了。我之前放在viewDidLoad中也没有用。谢谢大家!Akhilrajtr,请把你的评论改成问题,这样我就可以标记为已回答了。 - Robert J. Clegg
显示剩余7条评论
2个回答

2

viewDidAppear中添加-addObserver:,在viewDidDisappear中添加-removeObserver:

- (void)viewDidAppear:(BOOL)animated
{
    //...
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(userPickedAuserNameFromSuggestion:)
                                                 name:@"UserTappedButton"
                                               object:nil];
    //...
}

- (void)viewDidDisappear:(BOOL)animated
{
    //...
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:@"UserTappedButton"
                                                  object:nil];
    //...
}

这并不能真正解决手头的问题。事实上,它会使情况变得更糟,因为它将阻止他的viewController接收通知。此外...当视图消失时,并不绝对需要使用removeObserver:,因为在某些情况下,您可能希望类在视图消失时仍然保持观察状态。 - staticVoidMan
@staticVoidMan 这并非必须。但是,如果视图未显示,为什么要继续观察通知呢?这可能是无用的(除了某些情况外,但我只对在实际显示视图时感兴趣的通知感兴趣)。对于这个问题,这解决了他的问题(请参见评论),这就是为什么我将其作为答案的原因。 - Akhilrajtr

0

我认为你的通知观察者没有正确释放,你需要这样做:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"UserTappedButton" object:nil];

dealloc函数中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接