使用故事板中定义的自定义类

Posted

技术标签:

【中文标题】使用故事板中定义的自定义类【英文标题】:using custom class defined within storyboard 【发布时间】:2019-06-02 08:58:24 【问题描述】:

在 Xcode 中,我可以在标识符检查器中定义一个自定义类,但我该如何使用它们?下面的例子:

class c1 : UITableViewCell 

  func celltest() 
        let i = 99;
    


class NicePlaceTableViewController: UITableViewController 
.
.
.
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath)
        **cell.celltest()** .. has no member celltest
        let place = places[indexPath.row]
        cell.textLabel?.text = place.name
        cell.detailTextLabel?.text = "\(place.timestamp)"
        return cell
    

如果知道reuseIdentifier,但不知道它的自定义类——在本例中是“c1”——我怎样才能在不违反Xcodes编译检查的情况下访问类c1中定义的方法?

【问题讨论】:

【参考方案1】:

你只需要强制转换为c1:

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath) as! c1
cell.celltest()

顺便说一句,c1 不是一个好的类名。

【讨论】:

【参考方案2】:

您只需要将单元格类型转换为c1 的对象。您可以通过在cellForRowAt 方法中编写以下代码来做到这一点,如下所示:

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath) as! c1

因此编译器会知道您的自定义 tableview 单元类的类型,cell.celltest() 不会给您错误。

另一个快速风格指南的参考,它可以极大地帮助你使用类名和方法名:

https://github.com/raywenderlich/swift-style-guide

【讨论】:

【参考方案3】:

我不知道类名“c1”。有什么办法可以动态获取吗?我不明白为什么单元格被其reuseIdentifier“cell1”查询并且xcode不知道应该指定单元格的类? (c1)

【讨论】:

恐怕不行。您必须输入单元格(在情节提要中分配的类),然后才能使用自定义 tableview 单元格的属性和方法。【参考方案4】:

Xcode Interface Builder 是一个可视化创建 UI 界面的 IDE。

您对 tableview 内的单元格的配置将使用在 tableview 中注册的 c1 单元格实例化 NicePlaceTableViewController。

如果没有带有 Interface Builder 工具的 Xcode,您必须自己以编程方式创建它,如下所示:

class NicePlaceTableViewController: UITableViewController 
    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.register(c1.self, forCellReuseIdentifier: "Cell1")
    

此代码为给定标识符注册一个类类型。要访问单元格,您必须使用 tableView.dequeueReusableCell 方法,该方法将作用于内部池以创建或重用单元格。

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath)

出队的单元格是 UITableViewCell 类型。如果您想将其向下转换为 c1 类型,那么您必须使用 !运算符。

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath) as! c1

【讨论】:

以上是关于使用故事板中定义的自定义类的主要内容,如果未能解决你的问题,请参考以下文章

XCode故事板中的自定义静态表格单元格?

故事板中的自定义转场

故事板中的自定义导航控制器

故事板中的自定义 UIView 不显示子视图

故事板中的自定义表格视图单元格布局似乎无效

如何更新动态生成的故事板中的自定义特定 UITableview 单元格?