当我向下滚动时,iOS swift数据与单元格不匹配

时间:2015-06-02 03:10:07

标签: ios uitableview swift cell

我遇到这个问题,当我点击由segue准备的ReadMore按钮时,我得到了错误的值 - > cidCTV(我的数据库中的ID号)。代码中没有错误,我无法将正确的值传递给下一个控制器。 附:我做了一个println来测试单元格中加载的值,当我向下滚动时,在下一个单元格完全查看之前,该值跳转到下一个。
在开始滚动之前,有没有办法将我的所有值设置为我的cidCTV到所有单元格?或者可能是我的故事板对齐单元格是错误还是什么?

我的结构

class Entry : NSObject {

var color : String = String()
var divider : String = String()
var cid : String = String()


var image : String = String()
var heading : String = String()
var title : String = String()
var desc : String = String()
}

class ChapterData : NSObject {
var newEntryArray : Array<Entry> = [];
}

这是我的ChapterTableViewController.swift

import Foundation
import UIKit

class ChapterTableViewController: UITableViewController {

var cidCTV : String = "";  

var pa55DB : COpaquePointer = nil
var selectStatement : COpaquePointer = nil;
var sqlString : String = "";

var arrEntryInfo : ChapterData = ChapterData()

override func viewDidLoad() {
    super.viewDidLoad()

    openDB()
    arrEntryInfo = executeSelect()

    println("Testing...")
}

func openDB() {
    var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String
    var docsDir = paths.stringByAppendingPathComponent("pa55.sqlite")

    if (sqlite3_open(docsDir, &pa55DB) == SQLITE_OK) {
        println("success open database")
    }
    else {
        println("failed to open database")
    }
}

func executeSelect() -> ChapterData   {
    sqlString = "SELECT * FROM Chapter where SHOW = 'true' ORDER BY CID ASC"
    var cSql = sqlString.cStringUsingEncoding(NSUTF8StringEncoding)
    sqlite3_prepare_v2(pa55DB, cSql!, -1, &selectStatement, nil)

    println("startment start")

    var localEntryInfo : ChapterData = ChapterData()

    while (sqlite3_step(selectStatement) == SQLITE_ROW) {
        var entryInfo: Entry = Entry()

        let cid_buf = sqlite3_column_text(selectStatement, 0)
        var cid1 = String.fromCString(UnsafePointer<CChar>(cid_buf))

        let image_buf = sqlite3_column_text(selectStatement, 3)
        var image1 = String.fromCString(UnsafePointer<CChar>(image_buf))

        let heading_buf = sqlite3_column_text(selectStatement, 1)
        var heading1 = String.fromCString(UnsafePointer<CChar>(heading_buf))

        let title_buf = sqlite3_column_text(selectStatement, 2)
        var title1 = String.fromCString(UnsafePointer<CChar>(title_buf))

        let desc_buf = sqlite3_column_text(selectStatement, 4)
        var description1 = String.fromCString(UnsafePointer<CChar>(desc_buf))

        let divider_buf = sqlite3_column_text(selectStatement, 5)
        var divider1 = String.fromCString(UnsafePointer<CChar>(divider_buf))

        let color_buf = sqlite3_column_text(selectStatement, 7)
        var color1 = String.fromCString(UnsafePointer<CChar>(color_buf))

        entryInfo.cid = cid1!;
        entryInfo.image = image1!;
        entryInfo.heading = heading1!;
        entryInfo.title = title1!;
        entryInfo.desc = description1!;
        entryInfo.divider = divider1!;
        entryInfo.color = color1!;

        localEntryInfo.newEntryArray.append(entryInfo)
    }
    println("select statement successful executed")
    return localEntryInfo
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

//MARK: navigation title

override func viewDidAppear(animated: Bool) {

    //navigation bar title image
    var nav = self.navigationController?.navigationBar

    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 45, height: 32.5))
    imageView.contentMode = .ScaleAspectFit

    let image = UIImage(named: "we_logo.jpg")
    imageView.image = image

    navigationItem.titleView = imageView
    navigationController!.navigationBar.barTintColor = UIColor.whiteColor()
}


// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return arrEntryInfo.newEntryArray.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! ChapterTableViewCell

    var entry1 : Entry  = arrEntryInfo.newEntryArray[indexPath.row]

    let color : NSString = entry1.color
    cell.dividerLabel.backgroundColor = hexStringToUIColor(color as String)

    cell.dividerLabel.text = entry1.divider
    cell.imageLabel.image = UIImage(named: entry1.image)
    cell.headingLabel.text = entry1.heading
    cell.titleLabel.text = entry1.title
    cell.descLabel.text = entry1.desc
    cell.readMoreButton.tag = (entry1.cid).toInt()!

    return cell
}

/*
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var entry1 : Entry = arrEntryInfo.newEntryArray[indexPath.row]
    cidCTV = entry1.cid
}
*/

@IBAction func shareChapter(sender: UIButton) {

    var shareChapter = "http://pa55.eu.pn/Pa55.html"

    let shareChapterC : UIActivityViewController = UIActivityViewController(activityItems: [shareChapter], applicationActivities: nil)

    self.presentViewController(shareChapterC, animated: true, completion: nil)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "ReadMoreSegue") {
        var svc = segue.destinationViewController as! ChapterStoryController;
        println("the cid value is \(cidCTV)")
    //    svc.dataPassed = cell.readMoreButton.tag
    }
}
}

1 个答案:

答案 0 :(得分:0)

您需要从cidCTV = entry1.cid方法移除cellForRowAtIndexPath并将其移至didSelectRowAtIndexPath,如下所示。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
     var entry1 : Entry  = arrEntryInfo.newEntryArray[indexPath.row]
     cidCTV = entry1.cid
}

问题是你没有在细胞选择上更新cidTV,但在细胞创建时不是正确的谷值。因为它始终具有最后创建的单元格的值。