Ios 以编程方式创建UIView子类的实例

Ios 以编程方式创建UIView子类的实例,ios,swift,Ios,Swift,我已经创建了UIView的一个子类,它刚刚覆盖了drawRect。为了简单起见,我不是在Interface Builder中创建UIView来表示我的子类,而是希望在UIViewController代码中创建它的实例 我尝试了以下方法: canvasView = CanvasView(frame: view.bounds) canvasView.dataSource = self 以及: canvasView = UIView(frame: view.bounds) as! CanvasVie

我已经创建了UIView的一个子类,它刚刚覆盖了drawRect。为了简单起见,我不是在Interface Builder中创建UIView来表示我的子类,而是希望在UIViewController代码中创建它的实例

我尝试了以下方法:

canvasView = CanvasView(frame: view.bounds)
canvasView.dataSource = self
以及:

canvasView = UIView(frame: view.bounds) as! CanvasView
canvasView.dataSource = self
但对于他们两个,我都收到了错误

“UIView”类型的值没有成员“dataSource”


正确的做法是什么?我需要在IB中创建UIView吗?它嵌入在UIScrollView中,我也在以编程方式创建该视图,并且运行良好,因此如果可能的话,我真的希望不必这样做。

除了UIView没有数据源这一事实之外,您所做的一切都很好

更多关于您想要实现的目标的信息将在这里有所帮助

因为我对你的画布没有定义,所以很难知道哪里出了问题。下面是我放在操场上的一些东西,它向您展示了一种为您的类设置数据源的方法

import UIKit

protocol DataSourceProtocol {
    var data: Any { get set }
}

class DataSource: DataSourceProtocol {
    var data: Any

    init(data: Any) {
        self.data = data
    }
}

class ViewWithDataSource: UIView {
    var dataSource: DataSourceProtocol?
}

let dataSource = DataSource(data: "Some Data")
let myView = ViewWithDataSource(frame: CGRectZero)
myView.dataSource = dataSource

编辑:编辑了一些不正确的陈述/假设

您如何声明您的
画布视图
?您是否执行了
var canvasView:UIView
?我不知道您对此的确切想法,但它清楚地表明
canvasView
类没有
dataSource
属性。那么告诉我们,到底有没有?CanvasView确实有。我得到的错误是UIView没有dataSource属性,这让我怀疑我是否正确创建了它的实例。那么我所做的看起来是正确的吗?是不是指定为
private
dataSource
属性?对此很抱歉,但我会信任编译器-在本例中-因为它非常简单,如果swift编译器是错误的,那将非常奇怪。
canvasView
是如何声明的?例如,编辑您的问题以显示
var canvasView…
我已经在我的类中声明了委托和数据源,但无可否认,对于iOS来说仍然是绿色的,我只是在遵循我看到的其他内置视图所做的。在这种情况下,我可能会转换为一名代表。您能为我们发布CanvasView的定义吗?@AdamCampbell
UITableView
有数据源,
UICollectionView
有数据源;视图没有理由不能有数据源。数据源实际上只是另一种委托模式;将委托(用于响应控件中的事件)和数据源(用于向控件提供数据)的功能分开可能是有意义的。您完全正确。答案已更新。我会在下周一早上回答之前再检查一下自己。