मैंने डमी डेटा के साथ एक संपर्क ऐप बनाया है और जब मैं एक नया संपर्क डालने का प्रयास करता हूं तो मेरे UITableView में दिखाई नहीं दे रहा है, लेकिन अगर मैं प्रिंटआउट करता हूं तो मेरी सरणी मुझे दिखा रही है कि वहां है। साथ ही मेरा डिलीट बहुत अच्छा काम नहीं कर रहा है। मेरी चयनित पंक्ति को हटाने के बजाय पूरे अनुभाग को हटा रहा है। क्या आप मेरे इन्सर्ट फंक्शन और मेरे डिलीट फंक्शन को ठीक करने में मेरी मदद कर सकते हैं? धन्यवाद।

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

class Contact {
    var fullName: String
    var phoneNumber: String?

    init(fullName: String, phoneNumber: String) {
        self.fullName = fullName
        self.phoneNumber = phoneNumber
    }
}


var contactsArray = [Contact]()

var sections = [[Contact]]()

// Logic functionality for my "Contact" application
class ContactViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var nameTextField: UITextField!
    @IBOutlet var phoneTextField: UITextField!
    @IBOutlet var contactsTableView: UITableView!


    override func viewDidLoad() {
        super.viewDidLoad()

 contactsTableView.delegate = self
        contactsTableView.dataSource = self
        phoneTextField.delegate = self

    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        contactsTableView.reloadData()
    }
}

extension ContactViewController: UITableViewDelegate, UITableViewDataSource{

    // Add a new contact to the end of list
    @IBAction func insertNewContact(_ sender: UIButton) {

        if nameTextField.text != nil && nameTextField.text != "" {

            contactsArray.append(Contact(fullName: nameTextField.text!, phoneNumber: phoneTextField.text!))
            contactsTableView.reloadData()


        }

    }

    // Return no of sections from your list
    func numberOfSections(in tableView: UITableView) -> Int {
        return sections.count
    }

    // Return no of rows in each section from your list
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sections[section].count
    }

    // Insert a custom cell in your table view
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let contact = sections[indexPath.section][indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
        cell.configContact(contact)
        return cell
    }


    // Delete a section when you swipe from right to left
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == UITableViewCellEditingStyle.delete{
            sections.remove(at: indexPath.row)
            contactsTableView.reloadData() // xCode is confused sometimes and because my outlet var was named "tableView" and not "contactsTableView" it was trying to reload data from the parameter "tableView" of function and delete wasn't working at all. Now is deleting the whole section but I still need to work on it.
        }
    }


}

स्क्रीनशॉट

0
Florentin Lupascu 28 मई 2018, 14:24

1 उत्तर

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

आपका डेटा contactsArray में निहित है, लेकिन आपकी तालिका का डेटा स्रोत sections सरणी है। contactsArray बदलने पर आपको sections ऐरे को अपडेट करना होगा।

अपने कोड को स्थानांतरित करें जो sections सरणी को अपनी विधि में बनाता है। contactsArray में डेटा डालने के बाद और टेबल पर reloadData() को कॉल करने से पहले इसे कॉल करें:

func createSectionsArray() {
    let firstLetters = contactsArray.map { $0.titleFirstLetter }
    let uniqueFirstLetters = Array(Set(firstLetters))

    sortedFirstLetters = uniqueFirstLetters.sorted()
    sections = sortedFirstLetters.map { firstLetter in
        return contactsArray
            .filter { $0.titleFirstLetter == firstLetter }
            .sorted { $0.fullName < $1.fullName }
    }
}

आप फ़ंक्शन बनाने के लिए निकाले गए कोड के स्थान पर इसे viewDidLoad() से भी कॉल करना चाहेंगे।


हटाना:

हटाने के लिए, पहले अपनी Contact कक्षा को Equatable के अनुरूप बनाएं:

class Contact: Equatable {
    static func == (lhs: Contact, rhs: Contact) -> Bool {
        return lhs.fullName == rhs.fullName && lhs.phoneNumber == rhs.phoneNumber
    }

    var fullName: String
    var phoneNumber: String?

    init(fullName: String, phoneNumber: String) {
        self.fullName = fullName
        self.phoneNumber = phoneNumber
    }
}

फिर, जब कोई आइटम हटा दिया जाता है, तो contact को देखने के लिए indexPath.section और indexPath.row का उपयोग करें, contact को contactsArray में ढूंढें और इसे हटा दें, पुन: उत्पन्न करें sections सरणी, फिर तालिका को पुनः लोड करें:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {
        let contact = sections[indexPath.section][indexPath.row]

        if let index = contactsArray.index(of: contact) {
            contactsArray.remove(at: index)
            createSectionsArray()
            contactsTableView.reloadData()
        }
    }
}
1
vacawama 28 मई 2018, 15:31