【问题标题】:NSNotification errorsNSNotification 错误
【发布时间】:2014-02-07 05:21:51
【问题描述】:

由于某种原因,我似乎卡在了 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. 在post方法之前先调用observer方法(是)
  2. 这两种方法的名称都是正确的
  3. 选择器签名正确

也看了一些 SO 答案,但没有帮助。

这里有什么我想念的吗?

*更新 *

对不起 - 这是我想要调用的方法:

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

}

但是它没有被调用

【问题讨论】:

  • 你不说是什么问题。
  • 你能展示你的方法吗 - userPickedAuserNameFromSuggestion
  • 你确定当用户点击按钮时suggestionsButton:方法被调用了吗?
  • 用我想要调用的方法更新了 OP。 SuggestionsButton 肯定是被调用的。我设置了一个断点并在其上设置了 NSLog 调用 NSLog 并在断点处停止执行。
  • addObserver: in viewWillAppearremoveObserver: in viewWillDisappear

标签: ios objective-c nsnotificationcenter


【解决方案1】:

-addObserver: 放入viewDidAppear 并将-removeObserver: 放入viewDidDisappear

- (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 不是必须的。但是如果视图没有显示,为什么还要继续观察通知呢?它可能没用(在某些情况下除外,但我只对实际显示视图的通知感兴趣)。对于这个问题,这解决了他的问题(见 cmets),这就是为什么我把它作为答案。
【解决方案2】:

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

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

dealloc 函数中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多