Ios 在Swift中从tableview中删除单元格后设置正确的uibutton状态
我是斯威夫特的新手,我很难对这个特殊的问题保持清醒的头脑。因此,如果我不能立即传达这一点,请耐心一点。;-)谢谢 基本上,我有一个类似于UITable中的待办事项列表。单元格中有一个UIButtons(带有自定义类)作为“复选框”。我将按钮状态存储在字典中,如下所示:Ios 在Swift中从tableview中删除单元格后设置正确的uibutton状态,ios,uitableview,swift,Ios,Uitableview,Swift,我是斯威夫特的新手,我很难对这个特殊的问题保持清醒的头脑。因此,如果我不能立即传达这一点,请耐心一点。;-)谢谢 基本上,我有一个类似于UITable中的待办事项列表。单元格中有一个UIButtons(带有自定义类)作为“复选框”。我将按钮状态存储在字典中,如下所示: var buttonState = [listItem1 : true, listItem2 : false, ...] 字典还存储在NSUserDefaults中。这一切都很好。我的问题是,当我使用UITableViewCel
var buttonState = [listItem1 : true, listItem2 : false, ...]
字典还存储在NSUserDefaults
中。这一切都很好。我的问题是,当我使用UITableViewCellEditingStyle.delete
函数删除单元格并在使用self.tableView.reloadData()
后重新加载表格时,按钮状态出现错误。在上面的示例中,如果我删除了listitem1,listItem2将显示为true。事实上,存储的值仍然是false。我想这一定和Indexath有关
注意:在self.tableView.reloadData()
到buttonState[listItem1]=nil之前,我确实更新了字典。这意味着我对字典中的每个列表项都有正确的值。此外,如果我完全重新加载视图(即返回模拟器中的一个屏幕并从头重新加载列表),所有按钮状态都会正确显示
在删除一个tablecell后,如何在不重新加载整个屏幕的情况下获得正确的按钮状态
希望所有这些都有道理!;-)
//赛博
UITableView中的相关代码:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CellItem", forIndexPath: indexPath) as customCell
//Identify Button with Tag
cell.checkbox.tag = indexPath.row
// Set Label
switch indexPath.section{
case 0:
cell.textLabel?.text = "\(kleidung[indexPath.row])"
case 1:
cell.textLabel?.text = "\(hygiene[indexPath.row])"
default:
cell.textLabel?.text = nil
}
// Set Cell State
cell.onLoadSet()
return cell
}
// DELETE TABLE ROW
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath){
if (editingStyle == UITableViewCellEditingStyle.Delete){
if (indexPath.section == 0) {
kleidung.removeAtIndex(indexPath.row)
let fixedPackItems = ",".join(kleidung)
packlisten![rowCount].setValue("\(fixedPackItems)", forKey: "kleidung")
} else if (indexPath.section == 1) {
hygiene.removeAtIndex(indexPath.row)
let fixedPackItems = ",".join(hygiene)
packlisten![rowCount].setValue("\(fixedPackItems)", forKey: "hygiene")
}
context.save(nil)
if var storedToDoItems: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("packItems") {
var itemString = storedToDoItems as? Dictionary<String, Bool>
state = itemString!
println(itemString)
}
let currentCell = tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell!
identifier = "\(currentCell.textLabel!.text!)\(rowCount)"
state[identifier] = nil
println(state)
let checkedItems = state as Dictionary
NSUserDefaults.standardUserDefaults().setObject(checkedItems, forKey: "packItems")
NSUserDefaults.standardUserDefaults().synchronize()
self.packlisteTable.reloadData()
}
}
override func tableView(tableView:UITableView,cellForRowAtIndexPath:nsindepath)->UITableView单元格{
让cell=tableView.dequeueReusableCellWithIdentifier(“CellItem”,forIndexPath:indexPath)作为customCell
//用标签标识按钮
cell.checkbox.tag=indexPath.row
//设置标签
开关indexPath.section{
案例0:
cell.textlab?.text=“\(kleidung[indexPath.row])”
案例1:
cell.textLabel?.text=“\(卫生[indexPath.row])”
违约:
单元格.textLabel?.text=nil
}
//设置单元状态
cell.onLoadSet()
返回单元
}
//删除表行
重写func tableView(tableView:UITableView,CommittedItingStyle editingStyle:UITableViewCellEditingStyle,forRowAtIndexPath indexPath:NSIndexPath){
if(editingStyle==UITableViewCellEditingStyle.Delete){
if(indexPath.section==0){
removateIndex(indexPath.row)
让fixedPackItems=“,”.join(kleidung)
packlisten![rowCount].setValue(“\(fixedPackItems)”,forKey:“kleidung”)
}else if(indexPath.section==1){
healthy.removatendex(indexPath.row)
让fixedPackItems=“,”。加入(卫生)
packlisten![rowCount].setValue(“\(fixedPackItems)”,forKey:“卫生学”)
}
context.save(无)
如果var storedToDoItems:AnyObject!=NSUserDefaults.standardUserDefaults().objectForKey(“packItems”){
var itemString=storedToDoItems作为字典
state=itemString!
println(itemString)
}
让currentCell=tableView.CellForRowatineXpath(indexPath)作为UITableViewCell!
标识符=“\(currentCell.textLabel!.text!)\(行数)”
状态[标识符]=nil
println(州)
让checkedItems=状态为字典
NSUserDefaults.standardUserDefaults().setObject(checkedItems,forKey:“packItems”)
NSUserDefaults.standardUserDefaults().synchronize()
self.packlisteTable.reloadData()
}
}
在customCell类中:
@IBAction func checkboxButton(sender: CheckBox) {
// Change Button State
if sender.isChecked == true {
sender.isChecked = false
}else{
sender.isChecked = true
}
//Retrieve stored state
if var storedToDoItems: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("packItems") {
var itemString = storedToDoItems as? Dictionary<String, Bool>
if itemString != nil {
state = itemString!
}
}
//Add new State to Stored
identifier = "\(textLabel!.text!)\(rowCount)"
state[identifier] = sender.isChecked
//Store state
let checkedItems = state as Dictionary
NSUserDefaults.standardUserDefaults().setObject(checkedItems, forKey: "packItems")
NSUserDefaults.standardUserDefaults().synchronize()
}
func onLoadSet(){
identifier = "\(textLabel!.text!)\(rowCount)"
//Set state from stored State
if var storedToDoItems: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("packItems") {
if storedToDoItems != nil {
var itemString = storedToDoItems as? Dictionary<String, Bool>
if itemString![identifier] != nil {
checkbox.isChecked = itemString![identifier] as Bool!
}
}
}
}
@IBAction func checkboxButton(发件人:复选框){
//更改按钮状态
如果sender.isChecked==true{
sender.isChecked=false
}否则{
sender.isChecked=true
}
//检索存储状态
如果var storedToDoItems:AnyObject!=NSUserDefaults.standardUserDefaults().objectForKey(“packItems”){
var itemString=storedToDoItems作为字典
如果itemString!=nil{
state=itemString!
}
}
//将新状态添加到存储的
标识符=“\(textlab!.text!)\(行数)”
状态[标识符]=发送方。已检查
//存储状态
让checkedItems=状态为字典
NSUserDefaults.standardUserDefaults().setObject(checkedItems,forKey:“packItems”)
NSUserDefaults.standardUserDefaults().synchronize()
}
func onLoadSet(){
标识符=“\(textlab!.text!)\(行数)”
//从存储状态设置状态
如果var storedToDoItems:AnyObject!=NSUserDefaults.standardUserDefaults().objectForKey(“packItems”){
如果storedToDoItems!=无{
var itemString=storedToDoItems作为字典
如果itemString![identifier]!=nil{
checkbox.isChecked=itemString![identifier]作为Bool!
}
}
}
}
好的,我找到了。令人难以置信的是,这最终是多么简单
我刚刚添加了一个else语句:
func onLoadSet(){
identifier = "\(textLabel!.text!)\(rowCount)"
//Set state from stored State
if var storedToDoItems: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("packItems") {
if storedToDoItems != nil {
var itemString = storedToDoItems as? Dictionary<String, Bool>
if itemString![identifier] != nil {
checkbox.isChecked = itemString![identifier] as Bool!
}
}
}
func onload集(){
标识符=“\(textlab!.text!)\(行数)”
//从存储状态设置状态
如果var storedToDoItems:AnyObject!=NSUserDefaults.standardUserDefaults().objectForKey(“packItems”){
如果storedToDoItems!=无{
var itemString=storedToDoItems作为字典
如果itemString![identifier]!=nil{
checkbox.isChecked=itemString![identifier]作为Bool!
}
}
}
工作代码:
func onLoadSet(){
identifier = "\(textLabel!.text!)\(rowCount)"
//Set state from stored State
if var storedToDoItems: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("packItems") {
if storedToDoItems != nil {
println(storedToDoItems)
var itemString = storedToDoItems as? Dictionary<String, Bool>
if itemString![identifier] != nil {
checkbox.isChecked = itemString![identifier] as Bool!
} else {
checkbox.isChecked = false
}
}
}
}
func onload集(){
标识符=“\(textlab!.text!)\(行数)”
//从存储状态设置状态
如果var storedToDoItems:AnyObject!=NSUserDefaults.standardUserDefaults().objectForKey(“packItems”){
如果storedToDoItems!=无{
println(存储项)
var itemString=storedToDoItems作为字典
如果itemString![identifier]!=nil{
checkbox.isChecked=itemString![identifier]作为Bool!
}否则{
checkbox.isChecked=false
}
}
}
}
能否显示的代码-tableView:cel