2016-12-04 2 views
0

У меня есть табличный вид с пользовательскими ячейками таблицы. Каждый может иметь разную высоту. Всего 14 строк, но другие строки не видны, и когда я прокручиваю вверх и вниз, строки исчезают.tableview с пользовательскими ячейками таблицы просмотра исчезает на прокрутке

Пожалуйста, предложите, где я делаю неправильно. Это отбивает меня от 2 дней. Я не могу найти решение.

Пожалуйста, найдите мой код для таблицы.

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

}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    if(fetchedElements[indexPath.row].elementType=="textarea") 
    { 
     return 100 ; 
    } 
    else if (fetchedElements[indexPath.row].elementType=="picklist") 
    { 
     return 60; 
    } 
    else if (fetchedElements[indexPath.row].elementType=="divider") 
    { 
     return 30; 
    } 
    else if (fetchedElements[indexPath.row].elementType=="scanner") 
    { 
     return 50; 
    } 
    else if (fetchedElements[indexPath.row].elementType=="multiselect") 
    { 
     return 60; 
    } 
    else if(fetchedElements[indexPath.row].elementType=="text") 
    { 
     var length = fetchedElements[indexPath.row].elementText?.characters.count 
     if length! < 30 
     { 
      return 80; 
     }else if length! < 60 && length! > 30 { 
      return 110; 
     }else if(length! < 100 && length! > 60) 
     { 
      return 130; 
     }else if(length! < 150 && length! > 100) 
     { 
     return 170; 
     } 
     else{ 
      return 140; 
     } 
    }else 
    { 
     return 200; 

    } 

} 


func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
{ 
    return UITableViewAutomaticDimension 

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    print("No of elements Fetched===\(fetchedElements.count)") 
    return fetchedElements.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 


var variableType = fetchedElements[indexPath.row].elementType 
    if(variableType==nil) 
    { 
     variableType = ""; 
    } 

var elementType = variableType! 

    print("=============Element Type=\(elementType)==============") 

    let frame = UIScreen.main.bounds 

    switch elementType { 
    case "picklist": 

     let dpcell = Bundle.main.loadNibNamed("Textbox", owner: self, options: nil)?.first as! Textbox 

     dpcell.backgroundColor = UIColor.lightGray 
     dpcell.txtValue.layer.cornerRadius = 3 


     dpcell.LabelName.text = "Country"//fetchedElements[indexPath.row].elementText 
     dpcell.txtValue.tag = Int(fetchedElements[indexPath.row].elementId) 
     dpcell.txtValue.addTarget(self, action: #selector(GoToDropdown), for: UIControlEvents.touchDown) 
     dpcell.txtValue.backgroundColor = UIColor.white 
     dpcell.txtValue.titleLabel?.numberOfLines = 0 
     dpcell.txtValue.titleLabel?.adjustsFontSizeToFitWidth = true; 
     dpcell.LabelName.lineBreakMode = .byWordWrapping 
     dpcell.LabelName.numberOfLines = 0 
     dpcell.selectionStyle = .none 
     print("============picklist==========\(indexPath.row)") 
     return dpcell 
    case "multiselect": 
     let dpcell = Bundle.main.loadNibNamed("Textbox", owner: self, options: nil)?.first as! Textbox 

     dpcell.backgroundColor = UIColor.lightGray 
     dpcell.txtValue.layer.cornerRadius = 3 
     dpcell.LabelName.text = fetchedElements[indexPath.row].elementText 
     dpcell.txtValue.tag = Int(fetchedElements[indexPath.row].elementId) 
     dpcell.txtValue.addTarget(self, action: #selector(GoToMultiSelect), for: UIControlEvents.touchDown) 
     dpcell.txtValue.backgroundColor = UIColor.white 
     dpcell.txtValue.contentHorizontalAlignment = UIControlContentHorizontalAlignment.left 
     dpcell.txtValue.titleLabel?.numberOfLines = 0 
     dpcell.txtValue.titleLabel?.adjustsFontSizeToFitWidth = true; 
     dpcell.selectionStyle = .none 
     print("===========multiselect===========\(indexPath.row)") 

     return dpcell 

    default: 
     let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! UITableViewCell 
     cell.textLabel?.text = "default" 
     print("==========dummy cell============\(indexPath.row)") 
     return cell 

} 

enter image description here

Это происходит после того, как свиток вниз и вверх

enter image description here

ответ

0

Примечание: Я не могу комментировать, потому что я не хватает репутации, поэтому я не мог спросить вас о некоторых запросов я есть .. Но, читая ваши коды, это то, что я могу предложить.

Я могу видеть, что данные имеют достаточно большое количество типов элементов, например, PickList, делитель, сканер и ЭСТ, в методе heightForRow делегата ..

Однако в функции cellForRow, у вас есть только два случая, PickList и MultiSelect ... Таким образом, все типы данных, которые имеют другой тип элемента, вернут вам ячейку с большим «значением по умолчанию» на ней.

Единственная своеобразная вещь, которую я не понимаю, заключается в том, что табличное представление, кажется, загрузилось совершенно в первую очередь. Таким образом, я задавался вопросом, как вы настроили tableview.

Если вы настроили его в раскадровке вручную .. Тогда в первый раз, когда приложение загрузится, оно представит все, что вы разработали в своем UITableView, но в тот момент, когда вы прокручиваете вверх и вниз, метод CellForItem , и перезапишите ячейку, возвращая вам большую ячейку «по умолчанию», которую вы видите в своем списке.

Так что, если я предполагаю, что это правильно ..

Тогда то, что вы должны сделать, это просто добавить все случаи типа на коммутаторе заявлении ваших методов cellForRow'S.

+0

Я просто удалил их, чтобы сделать код появляются немного меньше по размеру, но на самом деле они есть в моем коде, но все равно происходит то же самое. Я попытался изменить высоту для типа по умолчанию, типа текста и всех других типов, но ничего не происходит, но вы предположили, что я прав. настроить ta с использованием прототипа. Первоначально код загружает только 10 строк из 14, когда я прокручиваю вниз, он не может создать остальные 4 строки. Я вижу, что cellForRowAt indexPath выполняется снова в прокрутке, но он не создает ячейки. – Dev

+0

@NewbieIOS я вижу .. Итак, вы видите много «Dummy Cells», распечатанных в консоли при прокрутке вверх и вниз? – user3608914

+0

Я предвижу, что проблема не может быть связана с оператором switch. Таким образом, она распространяется до переменной varType = fetchedElements [indexPath.row] .elementType if (variableType == nil) { variableType = ""; } – user3608914

0

Вы можете посмотреть в диспетчерский асинхронном & tableView.reloadData

Поскольку я не могу увидеть весь код, я хотел бы предложить вам создать функцию, которая будет вызываться внутри viewDidLoad. Внутри этой функции, конечно, включают строки ниже, а также все, что вы хотите внутри своих панелей tableView. Я предполагаю, что вы используете массив для данных tableViews

DispatchQueue.main.async { 

tableView.reloadData 

} 
+0

Не могли бы вы рассказать подробнее. Я не потеряю все данные, существующие в текстовом поле и т. Д., Если я сделаю tableView.reloadData? – Dev

+0

@NewbieiOS Это просто обновляет ячейки tableViews. Проблема с ячейками tableView заключается в том, что даже если данные есть, он иногда загружает другие данные, прежде чем показывать их в tableView.Вызов асинхронных и перезагружаемых данных будет предотвращать это, делая его намного быстрее, если не мгновенно. Надеюсь, это поможет –

+0

Где я должен использовать приведенное выше утверждение? – Dev

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