当tableview滚动时,UISegment保持在同一行

时间:2016-07-12 23:39:42

标签: ios swift2 tableview uisegmentedcontrol

我有这个问题,我有一个tableview,通过分段控制管理3种不同类型的新闻。当我滚动新闻时,例如在第五个新的中,如果我点击第二个段,则出现在第5个位置。没有显示来自段1(新的)的消息,在第0行(开始),保持在我滚动时离开的位置。为什么会这样?我做错了什么?我正在使用一个tableview来查看3种不同类型的新闻,并在每次更改片段时重新加载tableview数据。

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

    NSLog("selectedSegmentIndex: \(self.sectionSegmentedControl.selectedSegmentIndex) - Row: \(indexPath.row)")


    let cell:UITableViewCell = self.tableview.dequeueReusableCellWithIdentifier("Cell")!

    // Grab the elements using the tag
    let labelTitle:UILabel? = cell.viewWithTag(1) as! UILabel?
    let labelSection:UILabel? = cell.viewWithTag(2) as! UILabel?
    let labelDate:UILabel? = cell.viewWithTag(3) as! UILabel?
    let imageView:UIImageView? = cell.viewWithTag(4) as! UIImageView?

    // Check which segment to get data from
    switch self.sectionSegmentedControl.selectedSegmentIndex {

    case 0:
         // If segment is 0, take data from cover News
        if (indexPath.row <= self.coverNews.count - 1){

            //Current new to display
            let currentNewToDisplay = self.coverNews[indexPath.row]
            //let currentNewToDisplay = self.news[indexPath.row]

            // Get the image and assign to the imageView
            if let actualImageView = imageView {

                // Imageview actually exists
                if currentNewToDisplay.imageUrl != "" {

                    // Image url exists, so download it
                    let imageUrl:NSURL? = NSURL(string: currentNewToDisplay.imageUrl)

                    // Download image with SDWebImage library
                    if let url = imageUrl {
                        actualImageView.sd_setImageWithURL(url)
                    }
                }
            }

            // Get the news title and assign to the label
            if let actualLabelTitle = labelTitle {

                let title = currentNewToDisplay.title
                actualLabelTitle.text = title
                actualLabelTitle.numberOfLines = 0
                actualLabelTitle.minimumScaleFactor = 0.1
            }

            // Get the news date and assign to the label
            if let actualLabelDate = labelDate {
                let character = "|  "
                actualLabelDate.text = character + currentNewToDisplay.date_short
            }

            // Get the news section and assign to the label
            if let actualabelSection = labelSection {
                actualabelSection.text = currentNewToDisplay.section
            }
        }

    case 1:
        // If segment is 1, take data from toprated News
    if (indexPath.row <= self.topratedNews.count - 1){

        let currentNewToDisplay2 = self.topratedNews[indexPath.row]

        // Get the image and assign to the imageView
        if let actualImageView2 = imageView {
            // Imageview actually exists
            if currentNewToDisplay2.imageUrl != "" {

                // Image url exists, so download it
                let imageUrl2:NSURL? = NSURL(string: currentNewToDisplay2.imageUrl)

                // Download image with SDWebImage library
                if let url2 = imageUrl2 {
                    actualImageView2.sd_setImageWithURL(url2)
                }
            }
        }

        // Get the news title and assign to the label
        if let actualLabelTitle2 = labelTitle {
            actualLabelTitle2.text = currentNewToDisplay2.title
            actualLabelTitle2.numberOfLines = 0
            actualLabelTitle2.minimumScaleFactor = 0.1
        }

        // Get the news date and assign to the label
        if let actualLabelDate2 = labelDate {
            let character2 = "|  "
            actualLabelDate2.text = character2 + currentNewToDisplay2.date_short
        }

        // Get the news section and assign to the label
        if let actualabelSection2 = labelSection {
            actualabelSection2.text = currentNewToDisplay2.section
        }
    }
    case 2:
    if (indexPath.row <= self.latestNews.count - 1){
        // If segment is 2, take data from latestNews News
        let currentNewToDisplay3 = self.latestNews[indexPath.row]

        // Get the image and assign to the imageView
        if let actualImageView3 = imageView {
            // Imageview actually exists
            if currentNewToDisplay3.imageUrl != "" {

                // Image url exists, so download it
                let imageUrl3:NSURL? = NSURL(string: currentNewToDisplay3.imageUrl)

                // Download image with SDWebImage library
                if let url3 = imageUrl3 {
                    actualImageView3.sd_setImageWithURL(url3)
                }
            }
        }

        // Get the news title and assign to the label
        if let actualLabelTitle3 = labelTitle {
            actualLabelTitle3.text = currentNewToDisplay3.title
            actualLabelTitle3.numberOfLines = 0
            actualLabelTitle3.minimumScaleFactor = 0.1
        }

        // Get the news date and assign to the label
        if let actualLabelDate3 = labelDate {
            let character3 = "|  "
            actualLabelDate3.text = character3 + currentNewToDisplay3.date_short
        }

        // Get the news section and assign to the label
        if let actualabelSection3 = labelSection {
            actualabelSection3.text = currentNewToDisplay3.section
        }
    }
    default:
        break
    }

    // Set insets to zero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

 // MARK: Segmented Control
 @IBAction func segmentedChanged(sender: UISegmentedControl) {

    switch self.sectionSegmentedControl.selectedSegmentIndex {

    case 0:

        // If segment is 0, return rows for coverNews array
        if (self.coverNews.count == 0) {
            loadNews()
        }else{
            dispatch_async(dispatch_get_main_queue(), {
                self.tableview.reloadData()
            })
        }
    case 1:

        // If segment is 1, return rows for topratedNews array
        if (self.topratedNews.count == 0) {
            loadNews()
        }else{
            dispatch_async(dispatch_get_main_queue(), {
                self.tableview.reloadData()
            })
        }
    case 2:

        // If segment is 2, return rows for latestNews array
        if (self.latestNews.count == 0) {
            loadNews()
        }else{
            dispatch_async(dispatch_get_main_queue(), {
                self.tableview.reloadData()
            })
        }
    default:
        break
    }
}

// MARK: Load News
func loadNews(){

    switch(sectionSegmentedControl.selectedSegmentIndex){
    case 0:
        self.model.getFeedNews("cover")
    case 1:
        self.model.getFeedNews("toprated")
    case 2:
        self.model.getFeedNews("latest")
    default:
        break
    }
}

0 个答案:

没有答案