如何检测类的属性何时更改
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;
当使用UIView
的setFrame
函数时,视图很容易检测到它应该改变它的框架。但是,当简单地更改属性 (view.frame
) 时,视图如何检测到其框架已更改(因为视图的框架会立即更新)?
【问题讨论】:
view.frame
和 setFrame:
是一回事。 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 视图何时更改
如何检测 amp 页面的 url 何时随 WKWebview 更改