Единый UITableView с другой пользовательской проблемой UITableViewCells

Я добавил UITableView в UIScrollView, я создал IBOutlet для ограничения высоты UITableView, который помогает мне в настройке размера содержимого UITableview.

У меня есть 3 вкладки, и я переключаю вкладки, чтобы перезагрузить данные из другого источника данных. Также у меня есть различные пользовательские ячейки, когда вкладка меняется. Поэтому, когда вкладка меняется, я вызываю reloadData

вот моя функция cellForRow

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        // Configure the cell...

        var cell:UITableViewCell!

        let event:Event!


        if(tableView == self.dataTableView)
        { 

                let eventCell:EventTableViewCell = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier, forIndexPath: indexPath) as! EventTableViewCell

                eventCell.delegate = self


                    event = sectionsArray[indexPath.section].EventItems[indexPath.row]




                eventCell.eventTitleLabel?.text = "\(event.title)"
                eventCell.eventImageView?.image = UIImage(named: "def.png")


                if let img = imageCache[event.imgUrl] {
                    eventCell.eventImageView?.image = img
                }
                else {
                    print("calling image of \(indexPath.row)  \(event.imgUrl)")
                    //      let escapedString = event.imgUrl.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
                    let session = NSURLSession.sharedSession()
                    do {
                        let encodedImageUrl = CommonEHUtils.urlEncodeString(event.imgUrl)
                        let urlObj = NSURL(string:encodedImageUrl)
                        if urlObj != nil {
                            let task = session.dataTaskWithURL(urlObj!, completionHandler: { ( data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
                                guard let realResponse = response as? NSHTTPURLResponse where
                                    realResponse.statusCode == 200 else {
                                        print("Not a 200 response, url = " + event.imgUrl)
                                        return
                                }
                                if error == nil {
                                    // Convert the downloaded data in to a UIImage object
                                    let image = UIImage(data: data!)


                                    // Store the image in to our cache
                                    self.imageCache[event.imgUrl] = image
                                    // Update the cell
                                    dispatch_async(dispatch_get_main_queue(), {
                                        if let cellToUpdate:EventTableViewCell = tableView.cellForRowAtIndexPath(indexPath) as? EventTableViewCell  {
                                            cellToUpdate.eventImageView?.image = image
                                        }
                                    })
                                }
                            })
                            task.resume()
                        }
                    } catch {
                        print("Cant fetch image \(event.imgUrl)")
                    }
                }


                cell = eventCell
            }
            else if(secodTabClicked)
            {
                let Cell2:cell2TableViewCell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier1, forIndexPath: indexPath) as! cell2TableViewCell

               //Image loading again takes place here                

                cell = Cell2

            }
else if(thirdTabClicked)
            {
                let Cell3:cell3TableViewCell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier2, forIndexPath: indexPath) as! cell3TableViewCell

               //Image loading again takes place here                

                cell = Cell3

            }


        return cell

    }

Как видите, на каждой вкладке есть свои ячейки с изображениями.

Ниже приведены проблемы, с которыми я сталкиваюсь

1) когда я переключаю вкладки, требуется время для перезагрузки данных, и их время значительно увеличивается. На iphone 4s хуже

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

Что я сделал до сих пор?

1) Я прокомментировал код извлечения изображения и проверил, вызывает ли это прерывистую прокрутку, но это не так.

2) Я использовал профилировщик времени, чтобы проверить, что занимает больше времени, и он указывает "dequeueReusableCellWithIdentifier". Так что я не знаю, что здесь происходит не так.

1 ответ

Ваш код не выглядит "симметричным" по отношению к ячейке, настроенной при secodTabClicked а также thirdTabClicked, я не вижу firstTabClickedи мне кажется, что условие, которое вы используете, чтобы определить, какая вкладка нажата, перекрывается с secodTabClicked а также thirdTabClicked, Другими словами, вы, вероятно, попадаете в верхнюю ветку и возвращаетесь EventTableViewCell когда cell2TableViewCell или же cell3TableViewCell ожидаемые.

Рефакторинг вашего кода, чтобы сделать выбор типа "симметричным" по отношению ко всем трем типам ячеек, должен решить эту проблему.

Другим решением может быть создание отдельных источников данных для разных вкладок и переключение источника данных вместо настройки xyzTabClicked флаги. В результате вы получите маленькие функции вместо одной большой функции, которая облегчит управление вашим кодом.

Другие вопросы по тегам