swift 中的错误序列 tableview.reloaddata()
wrong sequence tableview.reloaddata() in swift
我正在为 'checklist' 创作者编写代码'。应用程序中有几个部分。一个是从头开始创建一个新的清单。根据用户所做的选择,清单的一行将有一个复选框、输入字段或 yes/no 段开关。我设法使用 Parse 设置了这一切,但有一个问题。
当我单击一个按钮时,会添加一个新行,我可以在此处输入一些日期。
然后我可以再次点击同一个按钮,同样的事情发生等等。
但是,当我添加第五行时,第五行将成为当前的第一行,而第一行现在是空的。我已经添加了下面的代码。由于所有不同的变量,它很长,但我认为最重要的是
'add' IBaction 和配置 table 视图的部分。有人可以帮我解决问题吗?
谢谢,
斯文
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
我正在为 'checklist' 创作者编写代码'。应用程序中有几个部分。一个是从头开始创建一个新的清单。根据用户所做的选择,清单的一行将有一个复选框、输入字段或 yes/no 段开关。我设法使用 Parse 设置了这一切,但有一个问题。
当我单击一个按钮时,会添加一个新行,我可以在此处输入一些日期。 然后我可以再次点击同一个按钮,同样的事情发生等等。
但是,当我添加第五行时,第五行将成为当前的第一行,而第一行现在是空的。我已经添加了下面的代码。由于所有不同的变量,它很长,但我认为最重要的是 'add' IBaction 和配置 table 视图的部分。有人可以帮我解决问题吗?
谢谢, 斯文
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