繁体   English   中英

为什么我的强制向下转换在我的 Swift 应用程序中不起作用

[英]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”的成员

symbolValueCompanyStockCellPortraitCompanyStockCellLandscape的存储属性,它们都是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,两个不同的 NIB 或 storyboard 原型单元格,它们都使用相同的单元格 class; 或者
  • 有两个单元类,但是有一个协议来定义两个类之间的公共属性。

我认为具有自定义大小 class 约束的单个单元格 class 是最好的,但如果您的两个单元格也有明显不同的代码实现,那么您可以回退到其他两个较旧的模式之一。

我必须承认,这种大小为 class 的方法需要几次尝试才能适应它,因此您可以在尝试重构现有代码库之前尝试一些简单的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM