एक चेकलिस्ट ऐप विकसित करने की कोशिश कर रहा है और कुछ समय के लिए चेकमार्क की स्थिति को बचाने की कोशिश कर रहा है। जब मैं तालिका से बाहर जाता हूं तो सभी सहेजे गए चेकमार्क पर दृश्य और वापस मिट जाते हैं। मैंने यूकेआईटी आयात किया है और फिर कक्षा को परिभाषित किया है।

यहाँ मेरा कोड है:

var PreDefinedTasks = ["1", "2", "3", "4"]

// MARK: - Table view data source

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)

    if let cell = tableView.cellForRow(at: indexPath as IndexPath) {
        if cell.accessoryType == .checkmark{
            cell.accessoryType = .none
        }
        else{
            cell.accessoryType = .checkmark
        }
    }
}

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return PreDefinedTasks.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "List1", for: indexPath)

    cell.textLabel?.text = PreDefinedTasks[indexPath.row]

    return cell
}

मैंने समाधान के रूप में एनएससीओडर में देखा है लेकिन ऐसा लगता है कि यह ठीक से काम नहीं कर रहा है। किसी भी मदद की सराहना की जाती है!

1
user8194455 28 जुलाई 2017, 23:37

4 जवाब

सबसे बढ़िया उत्तर

यहां बताया गया है कि मैं इसके बारे में कैसे जाउंगा, यदि आप पूरे समाधान का पालन करते हैं, तो ऐप बंद होने पर भी यह बचत होगी।

बूल इस तरह से एक सरणी बंद करें: var checkmarks = [Int : Bool]()

फिर, सेलफॉररो फ़ंक्शन में, इसे जोड़ें:

if checkmarks[indexPath.row] != nil {
    cell.accessoryType = checkmarks[indexPath.row] ? .checkmark : .none
} else {
    checkmarks[indexPath.row] = false
    cell.accessoryType = .none
}

और didSelectRow फ़ंक्शन में, इसे जोड़ें:

if let cell = tableView.cellForRow(at: indexPath as IndexPath) {
    if cell.accessoryType == .checkmark{
        cell.accessoryType = .none
        checkmarks[indexPath.row] = false
    }
    else{
        cell.accessoryType = .checkmark
        checkmarks[indexPath.row] = true
    }
}

यदि आप ऐप बंद होने पर इसे सहेजना चाहते हैं, तो आपको ऐसा करके UserDefaults में चेकमार्क सरणी को सहेजना होगा:

DidSelectRow फ़ंक्शन में, सब कुछ जोड़ने के बाद सबसे नीचे:

UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: checkmarks), forKey: "checkmarks")
UserDefaults.standard.synchronize()

फिर भी, viewDidLoad में, इसे जोड़ें:

if let checks = UserDefaults.standard.value(forKey: "checkmarks") as? NSData {
    checkmarks = NSKeyedUnarchiver.unarchiveObject(with: checks as Data) as! [Int : Bool]
}

मुझे बताएं कि क्या इस उत्तर ने मदद की और यदि आपके कोई प्रश्न हैं।

संपादित करें: तो जो मैं पूरी तरह से भूल गया वह यह है कि [इंट: बूल] एक एनएस डिक्शनरी नहीं है, यह सिर्फ एक शब्दकोश है। UserDefaults डिक्शनरी ऑब्जेक्ट्स को स्टोर नहीं कर सकता, केवल NSDictionary यही कारण है कि आपको इसे NSData में बदलना होगा ताकि यह [Int: Bool] को सेव कर सके। आशा है कि यह इस बार काम करेगा :)

1
Timmy 29 जुलाई 2017, 02:36

आप अपनी तालिका दृश्य पंक्तियों पर चयनित चेकमार्क के आधार पर इंडेक्सपाथ को अपनी सरणी में सहेज सकते हैं।

0
Hussain Shabbir 28 जुलाई 2017, 23:45

आपके कार्यान्वयन के अनुसार, UITableViewCell पहचानकर्ता के साथ "सूची 1" के रूप में पुन: उपयोग किया जा रहा है। इसलिए यदि आप सेल का पुन: उपयोग करना चाहते हैं तो आपको पूर्वनिर्धारित कार्यों के विरुद्ध राज्य को संग्रहीत करके सही एक्सेसरी टाइप को अपडेट करते रहना होगा।

0
Shreekara 28 जुलाई 2017, 23:54

चूंकि सेल अनलोड हो जाते हैं और बाद में पुन: उपयोग किए जाते हैं, इसलिए आपको चेकमार्क की स्थिति को कहीं और स्टोर करना होगा। इस उदाहरण में preDefinedTaskCheckmarkState नामक सरणी में। सेल लोड करते समय आपको चेकमार्क स्थिति भी सेट करनी होगी।

var PreDefinedTasks = ["1", "2", "3", "4"]
var preDefinedTaskCheckmarkState = [Bool](repeating: false, count: 4)

// MARK: - Table view data source

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)

    if let cell = tableView.cellForRow(at: indexPath as IndexPath) {

        preDefinedTaskCheckmarkState[indexPath.row] = !(cell.accessoryType == .checkmark)

        cell.accessoryType = preDefinedTaskCheckmarkState[indexPath.row] ? .checkmark : .none
    }
}

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return PreDefinedTasks.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "List1", for: indexPath)

    cell.textLabel?.text = PreDefinedTasks[indexPath.row]
    cell.accessoryType = preDefinedTaskCheckmarkState[indexPath.row] ? .checkmark : .none

    return cell
}
0
Christoph 28 जुलाई 2017, 23:57