2015-08-28 8 views
0

Я создал несколько меток в своем табличном представлении, используя пользовательский UITableViewCell и построитель интерфейсов. Теперь я использую какой-то сторонний элемент управления BEMLineGraph, и я хочу добавить его в ячейку tableview с помощью кода. Он также имеет несколько делегатов и методы источников данных. Я делаю следующее, но проблема в том, что я получаю дубликаты графиков и перепутал данные при прокрутке вверх и вниз.Программируемый пользовательский UITableViewCell с использованием initWithStyle

ProductsTableViewCell.m

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     self.productGraph = [[BEMSimpleLineGraphView alloc] initWithFrame:self.graphContainter.frame]; 
     //_myGraph.enableTouchReport = YES; 
     self.productGraph.tag = 100; 
     self.productGraph.animationGraphStyle = BEMLineAnimationNone; 
     //_myGraph.enablePopUpReport = YES; 
     self.productGraph.enableXAxisLabel = YES; 
     self.productGraph.colorTouchInputLine = [UIColor whiteColor]; 
     self.productGraph.colorXaxisLabel = [UIColor darkGrayColor]; 
     self.productGraph.colorTop = [UIColor clearColor]; 
     self.productGraph.colorBottom = [UIColor clearColor]; 
     self.productGraph.colorLine = [UIColor colorWithRed:255.0/255.0 green:255.0/102.0 blue:255.0/102.0 alpha:1]; 
     self.productGraph.colorPoint = [UIColor lightGrayColor]; 
     [self addSubview:self.productGraph]; 
    } 
    return self; 
} 

TableViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    ProductsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

     cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    cell.productGraph.frame = CGRectMake(0, 0, cell.graphContainter.frame.size.width, cell.graphContainter.frame.size.height); 
    cell.productGraph.dataSource = self; 
    cell.productGraph.delegate = self; 

    //All the other stuff is set here and works well. 

    } 

- (NSInteger)numberOfPointsInLineGraph:(BEMSimpleLineGraphView *)graph 
{ 
if (graph.tag == 100) 
{ 
    return productDetail.count; 
} 
else 
{ 
    return numbers.count; 
} 

ответ

1

одна вещь неправильно, я могу увидеть код:

if (cell == nil) 
    { 
     cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; 
    } 

должно быть:

if (cell == nil) 
{ 
    cell = [[ProductsTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; 
} 

, но это не решит проблему дубликатов графов

Как вы подклассы ячейку в любом случае, почему бы вам не держать делегат и источник данных о productGraph в самой клетке

+0

Я отредактировал мой код, кажется, что ячейка никогда не ноль! Что касается делегата и источника данных, мне нужно вызвать их внутри TableViewController.m, так как я делаю некоторые подготовки данных и извлечение основных данных там. – user3687

+0

сохраните инструкцию if, это важно ... Что происходит в вашем случае, так это то, что вы добавляете subview в ячейку при каждом прокрутке, следовательно, вы можете видеть повторяющиеся графики – Jatin

+0

Почему я должен? С утверждением if ничего не появляется. Утверждение (cell == nil) всегда ложно. – user3687

1

Если вы зарегистрировали класс ProductsTableViewCell с UITableView, то dequeueReusableCellWithIdentifier: создаст для вас объект этого класса и вызовет его метод initWithCoder: (для ячеек, определенных в Interface Builder). Поэтому удалите вызов на ваш initWithStyle:reuseIdentifier: и выполните инициализацию в методе initWithCoder:ProductsTableViewCell.

Затем в вашем cellForRowAtIndexPath: сделайте только то, что характерно для этой ячейки. Это зависит от реализации вашего класса Graph, но он должен убедиться, что старый граф больше не отображается.

+0

Если я удалю initWithStyle: reuseIdentifier: как мне настроить график? – user3687

+0

Выполнение общей инициализации в методе init: метод класса и конфигурация, специфичная для ячейки в cellForRowAtIndexPath: – fishinear

+0

Ok Спасибо за помощь. Позвольте мне объяснить ситуацию немного больше. Я создал свою ячейку, используя пользовательский uitableviewcell. Метки и изображения в каждой ячейке создаются с помощью конструктора интерфейса. Но график, который я использую, может быть добавлен только программно (или, по крайней мере, то, что я думаю). На графике также есть несколько делегатов и источники данных. Теперь у меня проблемы с настройкой графиков. Графики дублируются друг на друга. – user3687

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