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

时间:2016-04-08 21:38:23

标签: ios swift uitableview cells

我正在为“核对清单”编写代码'创作者&#39 ;.应用程序中有几个部分。一个是从头开始创建新的清单。根据用户选择的一行选项,将有一个复选框,输入字段或是/否segmentwitch。我设法使用Parse设置这一切,但有一个问题。

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

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

谢谢, 斯文

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
        }

1 个答案:

答案 0 :(得分:0)

这很可能与您重复使用细胞有关。每次这样做:

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

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

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