【问题标题】:Checking for change in data application-wide检查应用程序范围内的数据变化
【发布时间】:2011-09-13 14:50:05
【问题描述】:

我的应用程序有一系列文本字段、复选框和其他控件。理想情况下,当任何(或所有)控件发生更改时,我会要求用户保存信息。

有没有办法让这个改变行为应用程序?或者我需要为每个控件创建一个操作并在那里设置代码?

如果这有什么不同,我正在使用 Xcode 4。

感谢您的帮助。

【问题讨论】:

  • 多个控件可以指向一个动作,然后可以根据发送者的标签或索引进行区分。

标签: objective-c macos cocoa xcode4


【解决方案1】:

无论如何,您都需要为每个控件编写代码(以处理用户更改)。

您可能需要为每个可变属性编写额外的代码,具体取决于您的应用设置方式。

我建议使用 NSNotificationCenter,并在您的数据属性之一发生更改时发送“某些更改”通知。

当你的控件被触摸时,你在一些数据存储对象上设置一个属性:

-(IBAction)grommetSwitchPress:(UISwitch*)sender
{
    self.userData.wantsGrommets = sender.on;
}

该数据存储类将定义一个属性:

@interface UserData : NSObject
{
}
@property (nonatomic, assign) BOOL wantsGrommets;

使用自定义属性设置器来测试值是否已更改:

-(void)setWantsGrommets:(BOOL)wantsThem
{
    if (wantsGrommets != wantsThem) // compares current property value with incoming
    {
        wantsGrommets = wantsThem;
        [[NSNotificationCenter defaultCenter]
                     postNotificationName:NOTIFY_SOMETHING_CHANGED
                   object:self];
    }
}

在某些标题中,您将定义通知消息:

#define NOTIFY_SOMETHING_CHANGED        @"somethingChanged"

您可以决定将监听 NOTIFY_SOMETHING_CHANGED 的代码放在应用中的哪个位置,例如:

- (void)viewDidLoad:(BOOL)animated
{   
    [[NSNotificationCenter defaultCenter] addObserver:self
               selector:@selector(somethingChanged:)
           name:NOTIFY_SOMETHING_CHANGED
             object:nil];   
}

例如,在 somethingChanged: 方法中,您可以将数据保存到 NSUserDefaults。

我建议不要“在任何(或所有)控件发生更改时要求用户保存信息”。询问用户是否希望保存自己的更改是一件很麻烦的事……他们当然会这样做。如果您想让他们有机会退出,请提供“还原”或“重置”按钮。

【讨论】:

  • 太棒了。让我试试,我会尽快回复你。
  • 应该如此。谢谢@ZeroDiv
猜你喜欢
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多