2016-03-06 6 views
0

Я создал подкласс UIView, который имеет только отмену drawRect. Для простоты я не создаю UIView в Interface Builder для представления того, что будет моим подклассом, но скорее хочу просто создать экземпляр его в моем коде UIViewController.Создать экземпляр подкласса UIView программно

Я попытался следующие:

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

Как также:

canvasView = UIView(frame: view.bounds) as! CanvasView 
canvasView.dataSource = self 

Но для обоих из них я получаю сообщение об ошибке ..

Значение типа ' UIView 'не имеет данных' источника данных '

Каков правильный способ обойти это? Do I нужно, чтобы создать UIView в IB? Он встроен в UIScrollView, который я также создаю программно и хорошо работает, поэтому я бы предпочел, чтобы не было, если это возможно.

+3

Как вы объявите свой 'canvasView'? Вы делали 'var canvasView: UIView'? –

+0

Я не знаю вашего твоего точного мышления об этом, но он ясно говорит, что класс 'CanvasView' не имеет свойства' dataSource'. Так скажите нам - это или нет? –

+0

CanvasView имеет его. Ошибка, которую я получаю, заключается в том, что UIView не имеет свойства dataSource, и именно поэтому я задаю вопрос, правильно ли я создаю его экземпляр. Что я делаю, выглядит правильно? – Mathieson

ответ

0

Что вы делаете, это нормально, за исключением того факта, что UIView не имеет источника данных.

Дополнительная информация о том, чего вы хотите достичь, была бы полезной здесь.

Поскольку у меня нет определения вашего CanvasView, трудно понять, что происходит не так. Ниже приведено то, что я собрал на игровой площадке, которая показывает вам, как вы можете настроить источник данных для своего класса.

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 

Edit: вырезаны некоторые некорректные заявления/предположения

+0

Я объявил как делегат, так и dataSource на моем классе, но, по общему признанию, все еще был зеленым для iOS. Я просто слежу за тем, что видел другие встроенные представления. Тогда я, вероятно, перейду к просто делегату. – Mathieson

+0

Можете ли вы опубликовать для нас определение CanvasView? –

+2

@AdamCampbell 'UITableView' имеет источник данных,' UICollectionView' имеет источник данных; нет причин, по которым у представлений нет источников данных.Источник данных - это просто еще один образец делегата; возможно, имеет смысл отделить функциональность делегата (который отвечает на события в элементе управления) и источник данных (который передает данные в элемент управления) – Paulw11