ios - swift 中的错误顺序 tableview.reloaddata()

标签 ios swift uitableview cells

我正在为“ list ”创建者编写代码。应用程序中有几个部分。一种是从头开始创建新的 list 。根据用户做出的选择, list 的一行将有一个复选框、输入字段或是/否分段开关。我设法使用 Parse 设置这一切,但有一个问题。

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

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

谢谢, 斯文

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

关于ios - swift 中的错误顺序 tableview.reloaddata(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36509753/

相关文章:

ios - 在 SpriteBuilder COCOS2d 3.4 中添加 UIViewController

ios - 滚动到 WatchKit 中 WKInterfaceTable 的顶部?

ios - [__NSCFString 计数] : unrecognized selector sent to instance

ios - UITableView 自定义拖放(Trello 风格)

javascript - 以编程方式关注移动 safari 中的下一个输入字段

ios - Passbook pkpass 文件无法在模拟器上运行

uiview - 更新 UIImageView Swift 的位置

ios - swift : Make a very short vibration

ios - 单击搜索项时 searchController 消失

第一次点击时未调用 UITableView didSelectRowAtIndexPath