【问题标题】:NSDatePicker bindingsNSDatePicker 绑定
【发布时间】:2014-05-30 03:31:55
【问题描述】:

为什么绑定到NSDatePicker 的属性值并不总是反映控件显示的内容?至少有 2 种情况,我的绑定属性的值与日期选择器显示的值不同:

  1. 初始值。日期选择器显示它的初始日期(在 IB 中设置)但绑定属性返回 nil(如果用户不与选择器交互)。
  2. 选择器中的最小值更改日期,但绑定属性仍返回旧值(用户在设置最小值之前设置的值)。

如果不支持这种基本行为,那么在目标/动作上使用绑定的原因是什么?我是 Cocoa 绑定的新手,所以也许我遗漏了一些东西。


更新:

Attached sample project to see the problem.

【问题讨论】:

标签: objective-c macos cocoa cocoa-bindings


【解决方案1】:

为什么绑定到 NSDatePicker 的属性值并不总是反映控件显示的内容?

Model-View-Controller 模式中,NSDatePicker 是视图,ViewController 是控制器,NSDate 属性是模型。

您通过控制器将视图绑定到模型。反之亦然。

当您通过控制器将视图绑定到模型时,视图将开始反映模型。如果您与视图交互(例如,更改日期),更改将应用​​于模型。

初始值。日期选择器显示它的初始日期(在 IB 中设置)但绑定属性返回 nil(如果用户不与选择器交互)。

NSDatePicker 显示任何默认值,因为模型不提供 NSDate 对象。 NSDatePicker 应该在没有用户交互的情况下更改模型。

选择器中的最小值更改日期,但绑定属性仍返回旧值(用户在设置最小值之前设置的值)。

NSDatePicker 只显示可接受值范围内的默认值,因为模型没有提供 NSDate 对象。

如果不支持这种基本行为,那么在目标/动作上使用绑定的原因是什么?

目标/动作只是绑定自动执行的一部分。如果没有绑定,您将在控制器(目标)中创建一个操作方法来处理用户交互(例如,用户更改日期)。在 action 方法中,您将更改模型对象。此外,在加载视图时,您会将视图与模型中的内容同步。 Bindings 消除了很多此类代码。

【讨论】:

  • 另外,初始NSDatePicker 值可以在内部直接设置为 ivar,无需通过设置器,因此不会触发 KVO 通知或绑定。
【解决方案2】:

NSDatePicker 不能显示空日期。如果您不设置 dateValue 或将值绑定到 nil,则控件仍会显示日期值;它喜欢 12/02/1982。

无法显示空日期,因此表明 nil 绑定很烦人。

下面的 NSDatePicker 子类可以显示一个空日期并表示一个 nil 绑定。

https://github.com/ThesaurusSoftware/TFDatePicker

运行 TFDatePickerTest 目标以查看其执行情况。

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多