2015-01-15 2 views
1

Это может показаться странным вопросом, но я пытаюсь реализовать библиотеку BEMSimpleLineGraph для генерации некоторых графиков, которые я размещаю в UITableView. Мой вопрос заключается в том, как я ссылаюсь на внешний dataSource и Delegate, чтобы иметь разные графики, размещенные в каждой ячейке (BEMSimpleLineGraph моделируется после UITableView и UICollectionView). Я в настоящее время есть что-то вроде этого:Как установить источник данных и делегировать внешний контроллер.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell: FlightsDetailCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as FlightsDetailCell 

    cell.userInteractionEnabled = false 

    if indexPath.section == 0 { 

     cell.graphView.delegate = GroundspeedData() 
     cell.graphView.dataSource = GroundspeedData() 
     return cell 

    } 
    if indexPath.section == 1 { 

     cell.graphView.delegate = self 
     cell.graphView.dataSource = self 
     return cell 

    } 
    return cell 
} 

Мой DataSource и делегат для секции 1, правильно ли установлена ​​ниже этого и класс GroundspeedData выглядит следующим образом:

class GroundspeedData: UIViewController, BEMSimpleLineGraphDelegate, BEMSimpleLineGraphDataSource { 

func lineGraph(graph: BEMSimpleLineGraphView!, valueForPointAtIndex index: Int) -> CGFloat { 
    let data = [1.0,2.0,3.0,2.0,0.0] 
    return CGFloat(data[index]) 
    } 

func numberOfPointsInLineGraph(graph: BEMSimpleLineGraphView!) -> Int { 
    return 5 
    } 
} 

По какой-то причине, когда я запустить приложение, Xcode сообщает, что он не может найти dataSource для раздела 0, в частности «Источник данных не содержит данных». Как я должен ссылаться на этот альтернативный источник данных?

ответ

5
cell.graphView.delegate = GroundspeedData() 
    cell.graphView.dataSource = GroundspeedData() 

Одна из проблем заключается в том, что делегат и источник данных являются слабыми ссылками. Это означает, что они не сохраняют то, на что они настроены. Таким образом, каждая из этих линий создает объект GroundspeedData, который мгновенно исчезает в клубе дыма. Вам нужно сделать объект GroundspeedData и сохранить его, а затем указать делегату графика и источнику данных ему.

Другая проблема заключается в: Вы намерены создать новый объект GroundspeedData или использовать тот, который существует уже в другом месте в вашей иерархии видов контроллера? Потому что GroundspeedData() создает новый один - без вида и данных. Вероятно, вы хотите использовать ссылку на существующий номер.

+0

Если, как я полагаю, ваша проблема заключается в том, что вы не понимаете разницу между _instantiating_ a class и получением ссылки на экземпляр _existing_ этого класса, в моем новом учебнике Swift есть раздел об этом самом деле: http: //www.apeth.com/swiftBook/ch04.html#_instance_references – matt

+0

У меня есть класс GroundspeedData, показанный выше, и я пытаюсь попросить мой graphView (для определенного раздела) взять его делегат и источник данных из этого класса. Имеет ли это смысл? Данные уже находятся в классе, мне просто нужно получить к нему доступ. – user3185748

+0

Нет, @ user3185748, нет такой вещи, как «данные уже находятся в классе». Данные находятся в _instance_ класса. Это целая концепция, которую вы не понимаете. – matt

Смежные вопросы