gpt4 book ai didi

ios - 在 Swift 中使用属性观察器修改 UI 组件

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:49 24 4
gpt4 key购买 nike

我创建了一个显示一些信息的 UICollectionViewCell 的子类。我有一个类型为 Weather 的属性。当设置了一个实例时,我想更新单元格。下面的方法不好吗?我在想,如果我在加载 UI 组件之前访问它,我可能会提前创建 View 。或者这是没有意义的,只适用于 UIViewController(关于尽早使用 view 属性)?

如果这样不好,正确的方法是什么?

var weather: Weather? {
didSet {
if let weather = weather {
dayLabel.text = dayFormatter.stringFromDate(weather.fromDate)

// ... more code like this
}
}
}

最佳答案

您可能需要一个 else但是,如果 weather 则清除文本字段是nil .同样,如果您可能从后台线程更新它,您可能希望将该 UI 更新分派(dispatch)回主线程。

请注意,当您设置 weather 时不会调用此观察者在单元格的 init 中(无论如何,@IBOutlet 也不会在此时配置)。因此,请确保您不依赖于它。

此外,如果 Weather是可变的,认识到如果你改变 fromDate现有 Weather对象,这不会捕获那个。 (如果 Weather 是可变的,您真的希望通过 KVO、委托(delegate)协议(protocol)模式或您拥有的其他方式捕获其不断变化的属性。)但是如果您使 Weather 成为不可变的,你应该没问题。


因此,从技术上讲,这就是问题的答案,但这引发了一些设计注意事项:

  1. 通常应该努力使不同类型松散耦合,即一种类型不应过于依赖另一种类型的内部行为。但是这里我们在细胞内有一个观察者,它依赖于 Weather 的可变性。 .

  2. 不建议使用存储属性在 View 中存储模型对象。单元格在屏幕外滚动时会被重复使用,但您可能需要一个单独的模型来捕获相关模型对象,然后 Controller 会根据需要处理向 View 对象(单元格)提供适当的模型对象。

    <

最重要的是,不建议将存储属性用于“ View ”中的“模型”信息。

您可以通过编写明确表示您只使用此 weather 的代码来解决这两个问题。参数仅用于更新 UI 控件,而不用于存储任何内容。因此,与其说是存储属性,不如说是使用一种方法:

func updateWithWeather(weather: Weather?) {
if let weather = weather {
dayLabel.text = dayFormatter.stringFromDate(weather.fromDate)

// ... more code like this
} else {
dayLabel.text = nil

// ... more code like this
}
}

这可能只会从 collectionView:cellForItemAtIndexPath: 中调用.

但是,这清楚地表明您只是根据天气参数更新控件,而不是尝试做任何超出此范围的事情。而且,巧合的是,天气对象的可变性现在已经无关紧要了,因为它应该如此。如果模型发生变化,请调用 reloadItemsAtIndexPaths: ,这将触发您的 collectionView:cellForItemAtIndexPath:被调用。

有时存储属性为 didSet观察者是一种有用的模式。但只有当该属性确实是一个 View 属性时才应该这样做。例如,考虑绘制某种形状的自定义 View 。您可能已经存储了指定绘制路径时要使用的笔划的宽度和颜色等属性。然后,为 lineWidth 存储属性和 strokeColor可能有道理,然后你可能有一个 didSet那叫setNeedsDisplay() (这会触发 View 的重绘)。

所以,你建议的模式确实有实际应用,只是它应该限于那些属性真正是 View 对象的属性的情况。

关于ios - 在 Swift 中使用属性观察器修改 UI 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34324273/

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