gpt4 book ai didi

Objective-C/ cocoa touch : Is it good design to set label texts in the setter of the UILabel object?

转载 作者:行者123 更新时间:2023-11-28 22:52:36 25 4
gpt4 key购买 nike

假设我有两个 UIViewController 的子类称为 MasterViewControllerDetailViewController .

DetailViewController具有 NSNumber 类型的属性称为 level和一个 UILabel称为 levelLabel .

MasterViewControllerDetailViewController 有联系称为 ToDetail . MasterViewController的prepareForSegue是这样的

    - (void)prepareForSegue:(UIStoryboardSegue)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"ToDetail"]) {
DetailViewController *detailVC = (DetailViewController *)segue.destinationViewController;
detailVC.level = [NSNumber numberWithInt:10]; // never mind the literal...pretend there was some algorithm for it
}
}

那么,在DetailViewController我们像这样实现 levelLabel 的 setter :

     - (void)setLevelLabel:(UILabel *)levelLabel
{
if (levelLabel) {
_levelLabel = levelLabel;
_levelLabel.text = level.stringValue;
}
}

这是好的代码设计吗?另外,你能批评我的代码编写风格吗?我几乎是即时编写所有这些代码,所以这几乎是我编写大部分代码的方式。

我在洗澡的时候想到了这个问题,因为这就是我实现几乎所有依赖于 segue 的标签文本的设置的方式。

最佳答案

以下是我对这种关系的思考方式。斜体适用于您的问题。

你有被控制的东西(标签) Controller (目标 View Controller )和它被控制的上下文(源 View Controller )。这也可以表示为模型- View - Controller ,但我认为考虑上下文可以适用于更具体和本地化的情况。

通常,您应该尽量使信息流向一个方向,即从上下文向下。对象不应该知道它们存在的上下文,即它们不应该询问任何信息,应该告诉它们操作所需的一切。所以源 View Controller 应该将级别推送到目标 View Controller ,目标 View Controller 应该将此信息推送到标签。这就是您已经拥有的东西。

以上述为基础,信息不仅应该朝一个方向流动,而且我还尝试确保关系是因果关系,即将信息从一个对象推送到另一个对象应该导致它随后是推到下一个对象。您的代码没有执行此操作,这可能就是您对此感觉不好的原因。

更合适的做法是在级别 setter 中设置标签的文本属性,这样当您设置或更改级别时,标签将随之更新。标签可能会加载,也可能不会加载,因此您必须检查它是否正在使用 -isViewLoaded-viewDidLoad 是在第一次加载时设置文本属性的合适位置。

(当我说“推”时,这只是我思考设置属性或传递参数的方式,因为它暗示了方向性。这实际上是依赖注入(inject)。拉取信息的一个例子是委托(delegate)和数据源。但请注意这里仍然对象不知道任何上下文,委托(delegate)和数据源被明确定义为协议(protocol),而不是类,并且通常在同一个头文件中,并且它们本身从周围的上下文中被推送到对象上。所以是的,对象正在请求信息,但根据它自己的条件和它不知道的系统。)

重新编码风格:

这正是我编写代码的方式,但请注意 Apple reserves the use of underscore prefixes

关于 Objective-C/ cocoa touch : Is it good design to set label texts in the setter of the UILabel object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11578805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com