Я динамически создаю 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. Я также могу предоставить дополнительную информацию или некоторые фотографии проблемы, если они не поняты правильно.
Вы пытались добавить метку к ячейке в раскадровке, а затем связать его с пользовательским классом или захватывая его с помощью 'viewWithTag '(Я знаю, что вы упомянули об этом методе, но у меня нет контекста того, как вы его используете). Возможно, вам нужно установить тег на 'sepetNameLabel' и попытаться извлечь его перед созданием и добавлением нового ярлыка. В основном с кодом выше вы ВСЕГДА добавляете еще одну метку, даже если ячейка уже имеет ее. Вам нужно проверить, есть ли у него один (вероятно, посмотрите свойство 'tag', а затем проверите для' viewWithTag' перед добавлением начальной метки) – DMCApps
Возможный дубликат [UITableViewCell addSubview Repeating Object] (http://stackoverflow.com/questions/ 11702635/uitableviewcell-addsubview-repeating-object) –
Можете ли вы предоставить несколько скриншотов? – KSR