ios - मैं किसी तालिका दृश्य में कोशिकाओं को कैसे जोड़ / हटा सकता / सकती हूँ?




swift uitableview model (4)

मुझे लगता है कि यह शायद एक XY समस्या है, इसलिए मैं कुछ पृष्ठभूमि जानकारी पहले दे दूँगा

मैं एक ऐसे एप का निर्माण कर रहा हूं जो एक "फॉर्म" दिखा सकता है उपयोगकर्ता कुछ सामान के साथ फ़ॉर्म भर सकता है और कुछ कस्टम चीज़ों को बना सकता है।

मुझे लगता है कि प्रपत्र के लिए तालिका दृश्य का उपयोग करना सबसे उपयुक्त बात है। और मैं सभी पाठ बक्से को प्रदर्शित कर सकता हूं, जिन्हें प्रत्येक तालिका कक्ष में भरना होगा।

यहां एक स्क्रीनशॉट है:

"नई इनपुट जोड़ें" बटन नीचे टैप किए जाने पर एक नया सेल डालेंगे। और अगर आप बाईं ओर दिए गए इनपुट में से एक को स्वाइप करते हैं, तो आपको "हटाएं" बटन मिलता है। आप इनपुट को हटाने के लिए इसका उपयोग कर सकते हैं।

जैसा कि आप देख सकते हैं, इस सारणी दृश्य को पंक्तियों को जोड़ने और हटाने की आवश्यकता है

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

मैंने टेबल व्यू के deleteRowsAtIndexPaths और insertRowsAtIndexPaths विधियों का उपयोग करने की कोशिश की। लेकिन अगर मैं ऐसा करता हूं:

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

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    cell.textLabel?.text = "Hello"
    return cell
}

// I use motionEnded here because I don't want to add a button or anything just to test this
override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
    tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: 0, inSection: 0)], withRowAnimation: .Fade)
}

इसके परिणामस्वरूप एक अपवाद हो सकता है कि एक पंक्ति को नष्ट करने के बाद तालिका दृश्य डेटा स्रोत के साथ असंगत है। इसका मतलब है कि मुझे इस असंगतता को संभाल करने के लिए कोड होना चाहिए। यह निश्चित रूप से मेरे कोड को पढ़ने के लिए कठिन बना देगा।

एक ही बात डालने की विधि के साथ जाती है।

इसके अलावा, मुझे ट्रैक करना होगा कि प्रत्येक अनुभाग में कितनी पंक्तियां हैं और मेरा कोड सिर्फ सचमुच गड़बड़ हो जाता है और वह सब कुछ के साथ निर्दोष है।

मैंने अन्य पुस्तकालयों की खोज भी की है, लेकिन वे सभी वास्तव में अजीब हैं और "टेबलव्यू मॉडेल" के रूप में सीधी नहीं हैं। वे सभी को तालिका दृश्य के लिए एक मॉडल बनाने की आवश्यकता होती है। मुझे समझ में नहीं आता कि मेरे मामले में यह कैसे करना है। मैं बस पाठ क्षेत्रों का एक गुच्छा प्रदर्शित करना चाहता हूँ!

मैं पंक्तियों को अधिक सुंदर ढंग से कैसे सम्मिलित या हटा सकता हूं? मुझे लगता है कि मुझे तालिका दृश्य के extension को लिखना है या मेरे तालिका दृश्य के लिए एक मॉडल लिखना सीखना है लेकिन मैं इन विधियों में से न तो कर पा रहा हूं


Answers

मुझे एक समाधान मिला!

मैं मूल रूप से प्रदर्शित करने के लिए टेबल व्यू के लिए कक्षों की सरणी को रखता हूं:

var cells: [[UITableViewCell]] = [[], [], []] // I have 3 sections, so 3 empty arrays

और फिर मैंने इन डेटा स्रोत विधियों को जोड़ा:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return cells.count
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return cells[section].count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return cells[indexPath.section][indexPath.row]
}

अब, मैं आसानी से कोशिकाओं को जोड़ और हटा सकता हूं:

func addCellToSection(section: Int, index: Int, cell: UITableViewCell) {
    cells[section].insert(cell, atIndex: index)
    tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: index, inSection: section)], withRowAnimation: .Left)
}

func removeCellFromSection(section: Int, index: Int) {
    cells[section].removeAtIndex(index)
    tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: index, inSection: section)], withRowAnimation: .Left)
}

सिर्फ दो पंक्तियों के साथ, मैं एनीमेशन के साथ कोशिकाओं को जोड़ / हटा सकता हूं!


क्योंकि आपके पास कोई data source नहीं है logically भी देखें: मान लें कि आप insertRowsAtIndexPaths के साथ एक नई पंक्ति जोड़ते हैं। तो अब आपके पास 2 rows हालांकि आपके numberOfRowsInSection हमेशा 1 लौट रहा है। इसलिए यह क्रैश हो जाएगा और इसके लिए डिलीट होगा। टेबल व्यू को collection साथ काम करना चाहिए ( NSArray , NSDictionary , NSSet आदि)। तुम्हारी मदद के लिए:

पहले से ही आपके पास एक फार्म है जो कि तुम्हारा है

obj-c यह समझने में आसान है कि कैसे डेटा स्रोत काम के साथ तालिका देखें

स्विफ्ट का उपयोग करके रिकॉर्ड जोड़ना, अपडेट करना, हटा देना और बढ़ाना


आप फॉर्म को बनाने के लिए एक टेबलव्यू का उपयोग कर सकते हैं लेकिन इन डेटा का ट्रैक रखने के लिए आपको एक उचित डेटा डिजाइन करना होगा। अब डेटासोर्स विधि को संशोधित किया जाना चाहिए

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

आप इस डेटा को संपादित कर सकते हैं स्रोत जब एक हटाने की कार्रवाई निम्नानुसार की जाती है

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        //Delete the row from the data source to ensure consistency
        self.array.removeAtIndex(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    }
}

आप dataSource रूप में एक मॉडल वर्ग का उपयोग कर सकते हैं।

class NewCustomOperation: NSObject {
   var name: String?
   var rejectFloatingPoints: Bool?
   var inputs: AvailableInputs?
   var results: Results?
}

class AvailableInputs: NSObject {
   var name: [String]?
   var description: [String]?
}

class Results: NSObject {
   var name: [String]?
   var formula: [String]?
}

एक और उदाहरण:

class func getExchangeRate(#baseCurrency: String, foreignCurrency:String, completion: ((result:Double?) -> Void)!){
    let baseURL = kAPIEndPoint
    let query = String(baseCurrency)+"_"+String(foreignCurrency)

    var finalExchangeRate = 0.0
    if let url = NSURL(string: baseURL + query) {
        NSURLSession.sharedSession().dataTaskWithURL(url) { data, response, error in

            if ((data) != nil) {
                let jsonDictionary:NSDictionary = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSDictionary

                if let results = jsonDictionary["results"] as? NSDictionary{
                    if let queryResults = results[query] as? NSDictionary{
                        if let exchangeRate = queryResults["val"] as? Double{
                            let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
                            dispatch_async(dispatch_get_global_queue(priority, 0)) {
                                dispatch_async(dispatch_get_main_queue()) {
                                    completion(result: exchangeRate)
                                }
                            }

                        }
                    }
                }
            }
            else {
                completion(result: nil)
            }

        }.resume()
    }
}    

कॉल करें:

 Currency.getExchangeRate(baseCurrency: "USD", foreignCurrency: "EUR") { (result) -> Void in
                if let exchangeValue = result {
                    print(exchangeValue)
                }
            }




ios swift uitableview model