[英]Why doesn't my forced downcast work in my Swift app
我正在尝试设置一个名为activeTableViewCell
的属性,声明为;
var activeTableViewCell: UITableViewCell?
在我的cellForRowAt
委托方法中使用 switch 语句,该方法根据另一个名为deviceOrientation
的属性将属性设置为两个可能值之一;
switch deviceOrientation {
case .portrait:
activeTableViewCell = tableView.dequeueReusableCell(withIdentifier: "CompanyStockCell", for: indexPath) as! CompanyStockCellPortrait
case .landscape:
activeTableViewCell = tableView.dequeueReusableCell(withIdentifier: "CompanyStockCell", for: indexPath) as! CompanyStockCellLandscape
}
但是Xcode在下一行代码报错;
activeTableViewCell.symbolValue.text = companyStockInfo[indexPath.row].symbol
带有错误信息;
“UITableViewCell?”类型的值? 没有名为“symbolValue”的成员
symbolValue
是CompanyStockCellPortrait
和CompanyStockCellLandscape
的存储属性,它们都是UITableViewCell
的子类。
我怎样才能让它工作?
您可以使用基类 class 来保存公共属性,并从中派生出另外两个类:
class CompanyStockCell: UITableViewCell {
var symbolValue: UILabel
// other common stuff
}
class CompanyStockCellPortrait: CompanyStockCell {
// specific portrait stuff
}
class CompanyStockCellLandscape: CompanyStockCell {
// specific landscape stuff
}
如果这两个类的存在仅仅是为了支持不同的布局,但在其他方面是相同的,我建议合并为一个 class。
例如,如果您希望为设备方向设置不同的布局,则使用尺寸类根据适当的方向实施唯一约束。
考虑我下面的示例,其中每个表行都有两个子视图,一个红色的和一个蓝色的。 让我们假设在横向模式下,可以看到一个并排显示,但在纵向模式下,您必须将第二个放在第一个下方。 您可以使用一个单元格 class 来处理这一切,但只需自定义在每个设备方向(即每个水平尺寸类别)中使用的约束。
在这种情况下,让我们只考虑一个特定的约束,即“两个视图的顶部是否应该对齐”。 在 Xcode 屏幕快照的突出显示部分,我显示约束未安装在水平紧凑尺寸 class(即纵向)中,而是安装在常规尺寸 class(即横向)中:
您可以对大小为 class 的每个约束重复该过程。
这有几个优点:
然后你最终得到一个单元格 class。它的代码更少,重复代码更少,并且完全消除了你如何在两个不同的类中引用相同属性的问题;
享受每个尺寸独特的布局 class(即方向); 和
animation 更优雅,不需要重绘整个视图,而是将视图动画到正确的位置,而无需在旋转事件时重新加载表视图:
如果由于某种原因您不能这样做,您还有其他一些选择:
我认为具有自定义大小 class 约束的单个单元格 class 是最好的,但如果您的两个单元格也有明显不同的代码实现,那么您可以回退到其他两个较旧的模式之一。
我必须承认,这种大小为 class 的方法需要几次尝试才能适应它,因此您可以在尝试重构现有代码库之前尝试一些简单的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.