如何检测类的属性何时更改

Posted

技术标签:

【中文标题】如何检测类的属性何时更改【英文标题】:How to detect when a property of a class is changed 【发布时间】:2013-03-25 03:49:50 【问题描述】:

更改UIView 的框架时,您有两个选择。第一种是将CGRect 作为参数传递给视图的setFrame 函数。另一种是将view.frame 设置为等于CGRect

1) [view setFrame:frame];
2) view.frame = frame;

当使用UIViewsetFrame 函数时,视图很容易检测到它应该改变它的框架。但是,当简单地更改属性 (view.frame) 时,视图如何检测到其框架已更改(因为视图的框架会立即更新)?

【问题讨论】:

view.framesetFrame: 是一回事。 view.frame = frame 被翻译成[view setFrame:frame] 在等号左侧使用属性访问器只是调用setter的点表示法,即setFrame:。您的 2 个“选项”是相同的。 【参考方案1】:

这就是 Objective-C 2.0 附带的点符号。它们主要用于获取和设置属性。

获取属性:view.frame。设置属性:view.frame = frame

但它们只是另一种方式或更简单的方式 (syntactic sugar) 编写:[view frame][view setFrame:frame]

它们就是这样,它们只是被翻译成简单的旧 Objective-C 消息。事实上,由于它们只是被翻译成消息,请尝试以下操作:

view.setNeedsDisplay;

请注意,setNeedsDisplay 不是实际属性,但由于它被翻译为[view setNeedsDisplay],它会起作用!按照惯例,点符号仅用于获取和设置属性,因此我不建议使用 view.setNeedsDisplay 之类的符号。

【讨论】:

+1 用于推荐 反对 使用点语法发送非属性消息。【参考方案2】:

view.frame = frame 等于 [view setFrame:frame]。使用点法设置属性与使用setXXX:XXX 相同。您可以在setXXX: 中添加NSLog,然后调用obj.XXX = XXX; 并检查控制台以查看是否打印了NSLog

示例:-

view.frame = frame; //If you set frame like this then

-(void)setFrame:(CGRect)frame

    //this will be call

【讨论】:

了解这一点的最简单方法......很好的例子 +1

以上是关于如何检测类的属性何时更改的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 UIPageViewController 视图何时更改

检测自定义按钮的 UIAppearance 代理中的更改

如何检测 amp 页面的 url 何时随 WKWebview 更改

如何检测何时加载通过道具提供的图像并更改 React 中的状态?

Android:如何通过通知下拉菜单检测设置何时更改?

如何在 Windows 上使用 GetSaveFileName 检测“另存为类型:”组合框何时更改?