2016-08-21 4 views
0

Я динамически создаю UITableView и заполняю его массивом, который заполняет мой словарь. Проблема в том, что когда я вношу некоторые изменения в словарь, повторно заполняю массив и обновляю данные таблицы, предыдущие данные ячейки остаются и новые данные записываются поверх предыдущих. Я пробовал много обходных решений, таких как изменение порядка вызовов методов, использование viewWithTag в подзаголовках, удаление субвью из супервизоров перед добавлением снова и т. Д. Ничего не работало, так как большинство ответов были старыми и имели отношение к «(cell == nil) «вопрос, в то время как я не принимаю этот путь. Вот код:UITableView reloadData() перезаписывает данные предыдущей ячейки

var sepetDict: [String: Int] = [:] 

var sepetDictCopy = [String]() 

override fun viewDidLoad() { 
    sepetTableView.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width, sepetDialogView.bounds.size.height) 
    sepetTableView.delegate = self 
    sepetTableView.dataSource = self 
    sepetTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "sepetCell") 
} 

func sepetClick() { 
    sepetDictCopy.removeAll() 
    sepetDictCopy = Array(sepetDict.keys) 
    sepetTableView.reloadData() 
    sepetTableView.removeFromSuperview() 

    self.view.addSubview(sepetDialogView) 
    sepetDialogView.addSubview(sepetTableView) 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let sepetCell = sepetTableView.dequeueReusableCellWithIdentifier("sepetCell", forIndexPath: indexPath) 

    let sepetNameLabel = UILabel() 

    sepetNameLabel.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width/2, 60) 
    sepetNameLabel.center = CGPointMake(25 + sepetDialogView.bounds.size.width/4 , 30) 
    sepetNameLabel.font = sepetNameLabel.font.fontWithSize(13) 
    sepetNameLabel.numberOfLines = 0 
    sepetNameLabel.textAlignment = NSTextAlignment.Left 
    sepetNameLabel.text = sepetDictCopy[indexPath.row] 

    sepetCell.contentView.addSubview(sepetNameLabel) 

    return sepetCell 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return sepetDictCopy.count 
} 

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return 60 
} 

В этом случае, я нажимаю на UIButton, он всплывает UIView и UITableView добавляет к этому UIView как подвид. Сначала нажмите, все отлично работает. Когда я закрываю этот UIView и повторно нажимаю на кнопку, в это время tableview загружается с новыми данными (также правильные данные), но перезаписывает предыдущие данные. В предоставленном коде я знаю, что я не добавляю никаких данных в массив, но проблема такая же, поскольку, например, у меня была «Пицца», написанная в UILabel, и когда я перезагрузил таблицу, все еще была «Pizza», но это (тем более, что ярлык перезаписывается на предыдущей метке). Скажем, я добавляю «Burger» в массив, tableview показывает «Burger» и «Pizza», но на этот раз «Burger» написан поверх предыдущей «Pizza» с индексом 0, а «Pizza» - только по индексу 1. Я также могу предоставить дополнительную информацию или некоторые фотографии проблемы, если они не поняты правильно.

+1

Вы пытались добавить метку к ячейке в раскадровке, а затем связать его с пользовательским классом или захватывая его с помощью 'viewWithTag '(Я знаю, что вы упомянули об этом методе, но у меня нет контекста того, как вы его используете). Возможно, вам нужно установить тег на 'sepetNameLabel' и попытаться извлечь его перед созданием и добавлением нового ярлыка. В основном с кодом выше вы ВСЕГДА добавляете еще одну метку, даже если ячейка уже имеет ее. Вам нужно проверить, есть ли у него один (вероятно, посмотрите свойство 'tag', а затем проверите для' viewWithTag' перед добавлением начальной метки) – DMCApps

+0

Возможный дубликат [UITableViewCell addSubview Repeating Object] (http://stackoverflow.com/questions/ 11702635/uitableviewcell-addsubview-repeating-object) –

+0

Можете ли вы предоставить несколько скриншотов? – KSR

ответ

0

Похоже, я не совсем понял концепцию метода viewWithTag. Я перестроил свой код, и он сработал. Для тех, кто ищет до даты ответа и код, вот он:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var sepetCell: UITableViewCell! = sepetTableView.dequeueReusableCellWithIdentifier("") 

    if (sepetCell == nil) { 
     sepetCell = sepetTableView.dequeueReusableCellWithIdentifier("sepetCell")! 

     let sepetNameLabel = UILabel() 

     sepetNameLabel.tag = 1 

     sepetNameLabel.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width/2, 60) 
     sepetNameLabel.center = CGPointMake(25 + sepetDialogView.bounds.size.width/4 , 30) 
     sepetNameLabel.font = sepetNameLabel.font.fontWithSize(13) 
     sepetNameLabel.numberOfLines = 0 
     sepetNameLabel.textAlignment = NSTextAlignment.Left 

     sepetCell.contentView.addSubview(sepetNameLabel) 
    } 

    let sepetNameLabel = sepetCell.contentView.viewWithTag(1) as! UILabel 
    sepetNameLabel.text = sepetDictCopy[indexPath.row] 

    return sepetCell 
} 
+0

Почему вы добавляете представление в код? Гораздо проще использовать пользовательскую ячейку вида таблицы, разработанную с помощью IBOutlets в Interface Builder. Посмотрите дату использования учебников, которые вы используете. Многие из них предлагают старомодные процедуры, такие как 'viewWithTag' в этом случае. – vadian

+0

Я работаю с разными размерами экрана, и все они должны быть точно рассчитаны. Для этой цели я не мог получить такую ​​же производительность, используя раскадровку. –

+0

A u t o l a y o u t ;-) – vadian

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