swift 中的错误序列 tableview.reloaddata()

wrong sequence tableview.reloaddata() in swift

我正在为 'checklist' 创作者编写代码'。应用程序中有几个部分。一个是从头开始创建一个新的清单。根据用户所做的选择,清单的一行将有一个复选框、输入字段或 yes/no 段开关。我设法使用 Parse 设置了这一切,但有一个问题。

当我单击一个按钮时,会添加一个新行,我可以在此处输入一些日期。 然后我可以再次点击同一个按钮,同样的事情发生等等。

但是,当我添加第五行时,第五行将成为当前的第一行,而第一行现在是空的。我已经添加了下面的代码。由于所有不同的变量,它很长,但我认为最重要的是 'add' IBaction 和配置 table 视图的部分。有人可以帮我解决问题吗?

谢谢, 斯文

Picture: This is what the mistake looks like. The last row is actually the one I configured as first row. The first row is now empty (off screen)

import UIKit
import Parse
import Foundation

var emptyone = true
class Homescreen: UITableViewController, UITextFieldDelegate {
var topField = [""]
var first = Bool()
var label1 = [""]
var switchEnab = [false]
var fieldEnab = [false]
var yesnoEnab = [false]
var topSegmentEnab = [false]
var topFieldEnab = [false]
var segmentName0 = [""]
var segmentName1 = [""]
var segmentName2 = [""]
var messageEnab = [false]
var message1 = [""]
var labelEnab = [false]
var field1 = [""]
var switch1 = [false]
var topSegment = [1]
var yesno1 = [1]
var nummer = Int()



// Add a new row
@IBAction func add(sender: AnyObject) {

    first = true



    self.label1.append("" as String!)
    self.topField.append("" as String!)
    self.segmentName0.append("" as String!)
    self.segmentName1.append("" as String!)
    self.segmentName2.append("" as String!)
    self.message1.append("" as String!)
    self.field1.append("" as String!)
    self.switchEnab.append(false)
    self.fieldEnab.append(false)
    self.topFieldEnab.append(false)
    self.yesnoEnab.append(false)
    self.topSegmentEnab.append(false)
    self.messageEnab.append(false)
    self.labelEnab.append(false)
    self.switch1.append(false)
    self.yesno1.append(1)
    self.topSegment.append(1)

    self.tableView.reloadData()


}


@IBOutlet var celOpmaak: UITableView!


// Function initators
var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
func busy(){
    activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 50, 50))
    activityIndicator.center = self.view.center
    activityIndicator.hidesWhenStopped = true
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
    view.addSubview(activityIndicator)
    activityIndicator.startAnimating()
    UIApplication.sharedApplication().beginIgnoringInteractionEvents()
}

func displayAlert(title: String, message: String){
    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { (action) in

    }))

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


// Final save of the checklist
@IBAction func saveButton(sender: AnyObject) {
    if last == true{

    dispatch_async(dispatch_get_main_queue()) {
        self.first = false
        self.tableView.reloadData()
    }



            busy()

        let newValues = PFObject(className: "clTypes")


        newValues["taskName"] = ""
        newValues["dateStamp"] = "  -  -  "
        newValues["topSegmentEnab"] = self.topSegmentEnab
        newValues["segmentName0"] = self.segmentName0
        newValues["segmentName1"] = self.segmentName1
        newValues["segmentName2"] = self.segmentName2
        newValues["topFieldEnab"] = self.topFieldEnab
        newValues["topField"] = self.topField
        newValues["label1"] = self.label1
        newValues["label1Enab"] = self.labelEnab
        newValues["fieldEnab"] = self.fieldEnab
        newValues["field1"] = self.field1
        newValues["switchEnab"] = self.switchEnab
        newValues["switch1"] = self.switch1
        newValues["yesnoEnab"] = self.yesnoEnab
        newValues["yesno1"] = self.yesno1
        newValues["topSegment"] = self.topSegment
        newValues["messageEnab"] = self.messageEnab
        newValues["message1"] = self.message1
        newValues["clType"] = clType1
        newValues["checklistTitle"] = checklistTitle1
        newValues.saveInBackground()
        self.activityIndicator.stopAnimating()
        UIApplication.sharedApplication().endIgnoringInteractionEvents()
        self.displayAlert("Checklist saved", message: "The checklist has been saved to the server succesfully")
        self.dismissViewControllerAnimated(true, completion: nil)
        self.tableView.reloadData()
        self.performSegueWithIdentifier("overview", sender: self)


    }else{
        displayAlert("No final button", message: "Please add a 'last' cell to the checklist")

    }
}



// VIEWDIDLOAD
override func viewDidLoad() {
    super.viewDidLoad()

    self.label1.removeAll(keepCapacity: true)
    self.field1.removeAll(keepCapacity: true)
    self.message1.removeAll(keepCapacity: true)
    self.topField.removeAll(keepCapacity: true)
    self.segmentName0.removeAll(keepCapacity: true)
    self.segmentName1.removeAll(keepCapacity: true)
    self.segmentName2.removeAll(keepCapacity: true)
    self.switchEnab.removeAll(keepCapacity: true)
    self.yesnoEnab.removeAll(keepCapacity: true)
    self.topFieldEnab.removeAll(keepCapacity: true)
    self.fieldEnab.removeAll(keepCapacity: true)
    self.messageEnab.removeAll(keepCapacity: true)
    self.labelEnab.removeAll(keepCapacity: true)
    self.switch1.removeAll(keepCapacity: true)
    self.topSegmentEnab.removeAll(keepCapacity: true)
    self.yesno1.removeAll(keepCapacity: true)
    self.topSegment.removeAll(keepCapacity: true)
   last = false
    //var helloWorldTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: Selector("sayHello"), userInfo: nil, repeats: true)


    toeVoegen.wraps = false
    toeVoegen.autorepeat = false
    toeVoegen.maximumValue = 80
    self.tableView.reloadData()


    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    self.navigationItem.rightBarButtonItem = self.editButtonItem()
}


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

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return label1.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
     var cell: UITableViewCell! = tableView.dequeueReusableCellWithIdentifier("cel", forIndexPath: indexPath) as! creatorCellTableViewCell
    if cell == nil{
        print("hoi")
        let cell = tableView.dequeueReusableCellWithIdentifier("cel", forIndexPath: indexPath) as! creatorCellTableViewCell

    if first == true{
    cell.option1.delegate = self
    func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            self.view.endEditing(true)
        }

        print(self.label1)
        print(Int(toeVoegen.value))
    label1[indexPath.row] = cell.labelField.text!
}else{

// This part is only called when the 'final save button' has been activated

label1[indexPath.row] = cell.labelField.text!
field1[indexPath.row] = ""
yesno1[indexPath.row] = 1
topField[indexPath.row] = ""
        // switchEnab, fieldEnab, yesnoEnab
    if cell.degreeField.selectedSegmentIndex == 1{

        labelEnab[indexPath.row]=false
        topFieldEnab[indexPath.row]=true
        topSegmentEnab[indexPath.row]=true
        segmentName0[indexPath.row] = ""
        segmentName1[indexPath.row] = ""
        segmentName2[indexPath.row] = ""

        if cell.typeField.selectedSegmentIndex == 0{

        switchEnab[indexPath.row] = false
        fieldEnab[indexPath.row] = true
        yesnoEnab[indexPath.row] = true
        messageEnab[indexPath.row]=false
        message1[indexPath.row]=cell.messageField.text!
        }else if cell.typeField.selectedSegmentIndex == 1{

        switchEnab[indexPath.row] = true
        fieldEnab[indexPath.row] = true
        yesnoEnab[indexPath.row] = false
            if cell.messageSwitch.on == true{
            messageEnab[indexPath.row]=cell.messageSwitch.on
            message1[indexPath.row]=cell.messageField.text!
            }else{
            messageEnab[indexPath.row]=false
            message1[indexPath.row]="hallo"
            }
        }else if cell.typeField.selectedSegmentIndex == 2{

        labelEnab[indexPath.row]=false
        switchEnab[indexPath.row] = true
        fieldEnab[indexPath.row] = false
        yesnoEnab[indexPath.row] = true
        messageEnab[indexPath.row]=false
        message1[indexPath.row]=""
        }


    }else if cell.degreeField.selectedSegmentIndex == 0{

        switchEnab[indexPath.row]=true
        fieldEnab[indexPath.row]=true
        yesnoEnab[indexPath.row]=true
        labelEnab[indexPath.row]=true
        messageEnab[indexPath.row]=false
        message1[indexPath.row]=""
            if cell.topVeld.selectedSegmentIndex == 0{

        topSegmentEnab[indexPath.row] = false
        topFieldEnab[indexPath.row] = true


        segmentName0[indexPath.row] = cell.option1.text!
        segmentName1[indexPath.row] = cell.option2.text!
        segmentName2[indexPath.row] = cell.option3.text!
            } else{

                topSegmentEnab[indexPath.row]=true
                topFieldEnab[indexPath.row]=false
            }
    }

    }
}
    return cell
        }

这很可能与您重复使用单元有关。每次执行此操作时:

let cell = tableView.dequeueReusableCellWithIdentifier("cel",
   forIndexPath: indexPath) as! creatorCellTableViewCell

返回的单元格可能与该索引处的原始单元格不同(一旦您的行数多于屏幕上显示的行数,很有可能)。例如,当您向上滚动到第 5 行并且第 1 行不再出现在屏幕上时,您可能会得到与第 1 行完全相同的单元格显示在第 5 行。当您重复使用单元格时,您必须每次都在单元格上设置状态。例如:

let cell = tableView.dequeueReusableCellWithIdentifier("cel",
   forIndexPath: indexPath) as! creatorCellTableViewCell

cell.labelField.text! = label1[indexPath.row]
// do this for every field that needs to be set