【问题标题】:Add observer for a boolean value为布尔值添加观察者
【发布时间】:2011-12-10 06:14:22
【问题描述】:

我正在尝试向对象添加观察者并通过更改它的布尔值来触发它。

代码: 添加观察者:

[unitsCellViewController.cell addObserver:self forKeyPath:@"unit" options:0 context:nil];

在对象中,当文本字段发生变化时,我会改变布尔值并尝试触发通知:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if ([string length] != 0)
    {
        NSRange match = [@"0123456789" rangeOfString:string];
        if (match.location == NSNotFound) {
            return NO;
        }
    }

    [self willChangeValueForKey:@"unit"];
    self.on = !on;
    [self didChangeValueForKey:@"unit"];

    return YES;
}

但这不起作用,值确实发生了变化,但没有触发观察者。 我这样做正确吗?如果没有,如何在文本字段更改时触发事件?

【问题讨论】:

    标签: iphone objective-c ios observer-pattern


    【解决方案1】:

    您可以使用属性,并覆盖设置器

    在您的 .h 中

    @property (nonatomic, assign) BOOL myFlag;
    

    在你的 .m 中

    @implementation
    
    @synthesize myFlag = _myFlag;
    ...
    ..
    .
    
    
    - (void)setMyFlag:(BOOL)myFlag
    {
    if(myFlag != _myFlag){
    _myFlag = myFlag;
    [self postNotification];
    }
    }
    
    
    -(void)postNofitication
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"nameOfNotification" object:nil];
    }
    

    当标志的值改变时你执行一个动作。

    希望这能有所帮助。

    【讨论】:

    • 我有点困惑。我应该在 mySelector 中执行什么操作来触发通知?
    • 您需要/想要的操作。选择器或通知。 [self mySelector] 只是代表。你可以在那里编写任何你需要的代码。
    • 我有函数“- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context”。我希望它被触发,但我不知道该怎么做......
    • 我刚刚编辑了答案,让它更清楚。它只是一个例子。您可以使用通知或委托方法。
    • 优雅的解决方案!我们甚至不必担心注销观察者!
    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    相关资源
    最近更新 更多