2017-03-10 90 views
2

我想創建一個應用程序來選擇/取消選擇tableView中的行,所有數據從coreData加載,當我選擇一個元素,允許我更新它在coreData反之亦然,重新加載視圖或reloadData後在tableView中選擇複選標記問題

一開始一切正常,我負荷coreData數據,顯示的tableView的所有項目,並檢查行,如果需要的cellForRowAtIndexPath

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    var cell:UITableViewCell? = nil 

    let item = (arrayToDisplay[indexPath.section] as Array<NSManagedObject>)[indexPath.row] 

    cell = tableView.dequeueReusableCell(withIdentifier: "ShoppingCell")! 

    let lblName:UILabel = cell?.viewWithTag(101) as! UILabel 

    let attributedString = NSMutableAttributedString(string: (item.value(forKeyPath: "name") as! String?)!) 

    if(item.value(forKeyPath: "bought") as! Bool) 
    { 
     attributedString.addAttribute(NSStrikethroughStyleAttributeName, value: NSNumber(value: NSUnderlineStyle.styleSingle.rawValue), range: NSMakeRange(0, attributedString.length)) 
     attributedString.addAttribute(NSStrikethroughColorAttributeName, value: UIColor.red, range: NSMakeRange(0, attributedString.length)) 

     cell?.setSelected(true, animated: true) //set checkMark to active/checked status 

    } 


    lblName.attributedText = attributedString 

    return cell! 
} 

在這之前,我已經啓用editingStyle像下面

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle { 
    return UITableViewCellEditingStyle(rawValue: 3)! 
} 

一切正常,當我加載第一次來看,當我選中或取消選中我CoreData 更新值和刷新我的tableView,我重新從coreData和的tableView數據viewDidAppear,所以每當我場景之間的切換會有刷新,使用新的數據

當我在我的tableView檢查的項目,我保存數據,更新我的課陣列,並reloadData顯示新的變化(包括文字刪除線)

和這裏是問題,無論何時我重新加載tableView,或切換標籤(在TabBar),並返回,謝ckmarks沒有正確檢查,我無法檢查它們,它們看起來像是在不到一秒鐘內被檢查和未檢查,

我檢查了也許我在代碼中有一些衝突,但一切都是正確的因爲所有的更新操作都coreData得當,

我從Maitrayee Ghosh在ObjC writen其次示例項目,您可以通過添加[的tableView reloadData]模擬了同樣的問題,以didSelectRowAtIndexPath方法像下面

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
NSLog(@"user selected %@",[dataArray objectAtIndex:indexPath.row]); 

[tableView reloadData];} 

所以如何使用正確檢查複選標記狀態來刷新tableView內容改變狀態的能力,像Google Keep一樣複選框註釋

+0

你有什麼用'UITableViewCellEditingStyle(rawValue:3)'?只能使用'.none','.delete'或'.insert'的有效值之一。其他任何事物都是無證的,並可能在未來破裂。 – rmaddy

+0

'rawvalue:3' is .checkmark available via'cell?.accessoryType = .checkmark':/ – Godrix

+0

這完全錯了。如果您想設置複選標記,請設置正確的配件類型。編輯樣式不能使用完全不相關的值。 – rmaddy

回答

2

兩件事。

cellForRowAt您需要else您的if聲明。

if(item.value(forKeyPath: "bought") as! Bool) 
{ 
    attributedString.addAttribute(NSStrikethroughStyleAttributeName, value: NSNumber(value: NSUnderlineStyle.styleSingle.rawValue), range: NSMakeRange(0, attributedString.length)) 
    attributedString.addAttribute(NSStrikethroughColorAttributeName, value: UIColor.red, range: NSMakeRange(0, attributedString.length)) 

    cell?.setSelected(true, animated: false) 
} else { 
    cell?.setSelected(false, animated: false) 
} 

單元格被重用,因此您必須始終處理這兩種情況。

在您的didSelectRowAt方法中,您需要更新數據模型,以便cellForRowAt正確呈現單元格。

+0

謝謝@rmaddy,我已經嘗試過用'else'之前和現在,仍然是同樣的問題,也coreData和本地對象更新用於填充tableView,檢查所有數據,文本刪除線正在完美工作 – Godrix

+0

你需要確保您的數據模型已正確更新並保持。 – rmaddy

+0

正如我剛剛在第一條評論中所說的那樣,我所有的數據都會被檢查和更新,這很奇怪 – Godrix

相關問題