Когда я вставляю новую запись, не отображается в UITableview - PullRequest
0 голосов
/ 28 мая 2018

Я создал приложение Contact, заполненное фиктивными данными, и при попытке вставить новый контакт не появляется в моем 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.
        }
    }


}

Снимок экрана

1 Ответ

0 голосов
/ 28 мая 2018

Ваши данные содержатся в contactsArray, но источником данных вашей таблицы является sections массив.Вам нужно обновить массив sections при изменении contactsArray.

Переместить код, который создает массив 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
    }
}

Затем, когда элемент удален, используйте indexPath.section и indexPath.row для поиска contact, найдите 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()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...