Застревание табличного представления - PullRequest
0 голосов
/ 11 июня 2018

Я использую tableView, чтобы показать только текст.Внутри ячейки я использую UITextView с динамической высотой и linkDetection с html-текстом, преобразованным в attributedString.

. Я разбираю html-текст в атрибутивном тексте в моем классе model следующим образом:

if let nodeValue = dict["blurb_link"]{
    blurb_link = nodeValue as? String
    let attrString = NSMutableAttributedString(attributedString: (blurb_link?.html2AttributedString)!)
    atr_blurb_link = attrString
}

html2AttributedString в extension из String, который возвращает attributedString из HTML-текста.

Я заполняю свою ячейку внутри подкласса ячейки следующим образом,

textViewBlurbLink.attributedText = model.atr_blurb_link

Но проблема, которая возникает, заключается в том, что всякий раз, когда загружается новая ячейка, просмотр таблицы застревает на долю секунды, что делает прокрутку tableView немного прерывистой и беспокоящей для пользователя.

В ячейке нет ни изображений, ни видео, ни тяжелой задачи, которая может вызвать рывковую прокрутку.Скажите, пожалуйста, в чем может быть причина этой прокручивающейся и сбойной прокрутки?

РЕДАКТИРОВАТЬ:

Расположение моей ячейки:

enter image description here

После получения ответа я заполнил tableView следующим образом:

TSNetworkManager.getDataFor(Request: dataRequest, success: {response in
        //print(response.responseObject!)
        let model = TSLatestModel.init(WithDictionary:         response.responseObject as? [String : Any])
        completion(model)
        tblLatest.reloadData()
    }, failure: {error in
        onError(error)
})

и внутри cellForRowAtIndexPath

let modelLatestDetails = model?.data![indexPath.section].items![indexPath.row]
cell.setupCellData(model: modelLatestDetails!)

Внутри setupCellData в tableViewCell подкласс Я устанавливаю текст в textView.

EDIT2:

Это общая кодовая база моего model class

class TSLatestModel: TSModelBase {
var data : [LatestListModel]?
override init(WithDictionary dictionary: [String : Any]?) {
    super.init(WithDictionary: dictionary)
    if let dict = dictionary{
        if let nodeValue = dict["data"] {
            data = [LatestListModel]()
            for latest in nodeValue as! [Any]{
                let model = LatestListModel.init(WithDictionary: latest as? [String:Any])
                data?.append(model)
            }
        }
    }
}
}

class LatestListModel: NSObject {
var storyname : String?
var main_title : String?
var color : String?
var issuedate : String?
var formatted_issue_date : String?
var id : String?
var cat_name : String?
var cat_id : String?
var order : Int?
var items : [TSLatestDetailsModel]?
var itemsModified : [TSLatestDetailsModel]?
init(WithDictionary dictionary: [String : Any]?) {
    super.init()
    if let dict = dictionary {
        if let nodeValue = dict["items"] {
            items = [TSLatestDetailsModel]()
            itemsModified = [TSLatestDetailsModel]()
            for item in nodeValue as! [Any] {
                let model = TSLatestDetailsModel.init(WithDictionary: item as? [String : Any])
                items?.append(model)
                if !((item as! [String : Any])["one_liner"] as! String).isEmpty {
                    let filteredArray = itemsModified?.filter({$0.one_liner == ((item as! [String : Any])["one_liner"] as! String)})
                    if filteredArray?.count == 0 {
                        let model = TSLatestDetailsModel.init(WithDictionary: item as? [String : Any])
                        itemsModified?.append(model)
                    }
                }
            }
        }

        if let nodeValue = dict["item_list"] {
            items = [TSLatestDetailsModel]()
            itemsModified = [TSLatestDetailsModel]()
            for item in nodeValue as! [Any] {
                let model = TSLatestDetailsModel.init(WithDictionary: item as? [String : Any])
                items?.append(model)
                if !((item as! [String : Any])["one_liner"] as! String).isEmpty {
                    let filteredArray = itemsModified?.filter({$0.one_liner == ((item as! [String : Any])["one_liner"] as! String)})
                    if filteredArray?.count == 0 {
                        let model = TSLatestDetailsModel.init(WithDictionary: item as? [String : Any])
                        itemsModified?.append(model)
                    }
                }
            }
        }

        if let nodeValue = dict["_id"] {
            storyname = nodeValue as? String
        }

        if let nodeValue = dict["order"] {
            order = nodeValue as? Int
        }

        if let nodeValue = dict["category"] {
            cat_id = (nodeValue as! [Any])[0] as? String
        }

        if let dictStoryType = dict["_id"] as? [String : Any] {
            if let nodeValue = dictStoryType["issuedate"] {
                issuedate = nodeValue as? String
            }
            if let nodeValue = dictStoryType["formated_issue_date_title"] {
                formatted_issue_date = nodeValue as? String
            }
            if let nodeValue = dictStoryType["id"] {
                id = nodeValue as? String
            }
            if let nodeValue = dictStoryType["category_name"] {
                cat_name = nodeValue as? String
            }

        }

        if let nodeValue = dict["name"] {
            storyname = nodeValue as? String
        }

        if let nodeValue = dict["story"] {
            storyname = nodeValue as? String
        }

        if let nodeValue = dict["main_title"] {
            main_title = nodeValue as? String
        }

        if let nodeValue = dict["color"] {
            color = nodeValue as? String
        }

    }
}
}

class TSLatestDetailsModel: NSObject {

var __v : Int?
var _id : String?
var title : String?
var topic_key : String?
var blurb : String?
var blurb_link : String?
var atr_blurb_link : NSMutableAttributedString?
var formated_issue_date : String?
var formated_issue_date_item : String?
var formated_issue_date_title : String?
var issue_link : String?
var issue_title : String?
var issue_date : String?
var one_liner : String?
var main_title : String?
var source : String?
var source_link : String?
var isActive : Bool?
var isDeleted : Bool?
var isfavourite : Bool?
var story_order_number : Int?
var story_type : String?
var categories : [String]?
var story_type_model : TSStoryTypeDetailsModel?
var favourite_category_id : String?

init(WithDictionary dictionary: [String : Any]?) {
    super.init()
    if let dict = dictionary{
        if let nodeValue = dict["__v"]{
            __v = nodeValue as? Int
        }
        if let nodeValue = dict["_id"]{
            _id = nodeValue as? String
        }
        if let nodeValue = dict["title"]{
            title = nodeValue as? String
        }
        if let nodeValue = dict["topic_key"]{
            topic_key = nodeValue as? String
        }
        if let nodeValue = dict["blurb"]{
            blurb = nodeValue as? String
        }
        if let nodeValue = dict["blurb_link"]{
            blurb_link = nodeValue as? String
            let attrString = NSMutableAttributedString(attributedString: (blurb_link?.html2AttributedString)!)
            atr_blurb_link = attrString
        }
        if let nodeValue = dict["formated_issue_date"]{
            formated_issue_date = nodeValue as? String
        }
        if let nodeValue = dict["issue_date"]{
            issue_date = nodeValue as? String
        }
        if let nodeValue = dict["issue_link"]{
            issue_link = nodeValue as? String
        }
        if let nodeValue = dict["issue_title"]{
            issue_title = nodeValue as? String
        }
        if let nodeValue = dict["one_liner"]{
            one_liner = nodeValue as? String
        }
        if let nodeValue = dict["main_title"]{
            main_title = nodeValue as? String
        }
        if let nodeValue = dict["source"]{
            source = nodeValue as? String
        }
        if let nodeValue = dict["source_link"]{
            source_link = nodeValue as? String
        }
        if let nodeValue = dict["isActive"]{
            isActive = nodeValue as? Bool
        }
        if let nodeValue = dict["isfavourite"]{
            isfavourite = nodeValue as? Bool
        }
        if let nodeValue = dict["story_order_number"]{
            story_order_number = nodeValue as? Int
        }
        if let nodeValue = dict["story_type"]{
            story_type = nodeValue as? String
        }
        if let nodeValue = dict["formated_issue_date_title"]{
            formated_issue_date_title = nodeValue as? String
        }
        if let nodeValue = dict["formated_issue_date_item"]{
            formated_issue_date_item = nodeValue as? String
        }
        if let nodeValue = dict["favourite_category_ids"] {
            if (nodeValue as! [String]).count > 0 {
                favourite_category_id = (nodeValue as! [String])[0]
            }
        }
        if let nodeValue = dict["story_type"] {
            let model = TSStoryTypeDetailsModel.init(WithDictionary: nodeValue as? [String : Any])
            story_type_model = model
        }
        if let nodeValue = dict["category"] {
            categories = [String]()
            for category in nodeValue as! [String] {
                categories?.append(category)
            }
        }
    }
}
}

cellForRowAtIndexPath:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "TSArchiveDetailsCell") as! TSArchiveDetailsCell
    cell.delegate = self


    if !((favoriteDetilsModel?.data![indexPath.section].items![indexPath.row].source!.isEmpty)!) {
        cell.viewFav.isHidden = false
    } else {
        if favoriteDetilsModel?.data![indexPath.section].storyname?.lowercased() == "brush up" {
            cell.viewFav.isHidden = false
        } else {
            cell.viewFav.isHidden = true
        }
    }

    if isSayItOnRounds {
        let modelLatestDetails = favoriteDetilsModel?.data![indexPath.section].items?.filter({$0._id! == selectedItemId})[0]
        cell.setupCellData(model: modelLatestDetails!)
    } else if isBrushUp {
        let thirdBrushUpItemModel = favoriteDetilsModel?.data![indexPath.section].items![2]
        if thirdBrushUpItemModel?._id == selectedItemId {
            let modelLatestDetails = favoriteDetilsModel?.data![indexPath.section].items?.filter({$0._id == selectedItemId})
            cell.setupCellData(model: modelLatestDetails![0])
        } else {
            let modelLatestDetails = favoriteDetilsModel?.data![indexPath.section].items![indexPath.row]
            cell.setupCellData(model: modelLatestDetails!)
        }
    } else {
        let modelLatestDetails = favoriteDetilsModel?.data![indexPath.section].items![indexPath.row]
        cell.setupCellData(model: modelLatestDetails!)
    }
    return cell
}

1 Ответ

0 голосов
/ 11 июня 2018

Возможные проблемы:

  1. Макет ячейки. Мне нужно посмотреть, как вы делаете макет и повторно используете ячейку.
  2. Одновременный анализ данных и отрисовка ячеек. Необходимо создать все данные до (tableView.datasource = self or tableView.reloadData()).Итак, ваша [AttributedString] должна быть готова перед перезагрузкой tableView.Не анализируйте данные в cellfoRowAtIndexPath.

Кроме того, проверьте, что вызов tableView cellfoRowAtIndexPath только один раз для каждой ячейки за время существования ячейки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...