Невозможно удалить элемент из CNMutableContact в универсальной функции - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу разрешить пользователю удалять элементы (например, CNPhoneNumber, CNEmailAddresses) из контакта после отображения исходного контакта и в зависимости от того, что они выбирают, я удаляю из своего отредактированного контакта.

Даже если у меня есть изменяемый контакт и я использую изменяемый массив из ключа в моем коде, возвращенный отредактированный контакт не удалит элемент.

Что я здесь не так делаю?

Вот моя универсальная функция (работает и работает нормально, за исключением перечисленных выше проблем)

private func removeFromEditedContact<T:NSString>(labeledValueType:T, with key:String,from contact:CNContact,to toContact:CNContact, at indexPath:IndexPath) -> CNContact {

    let mutableContact = toContact.mutableCopy() as! CNMutableContact


    //what detail are we seraching for in the contact
    if let searchingArray = contact.mutableArrayValue(forKey: key) as? [CNLabeledValue<T>] {
        let searchValue = searchingArray[indexPath.row].value
        //if detail is present in our mutable contact remove it
        var labeledValueToChange = mutableContact.mutableArrayValue(forKey: key) as? [CNLabeledValue<T>]

        if let index = labeledValueToChange?.index(where: {$0.value == searchValue})  {
            labeledValueToChange?.remove(at: index)

        }
    }
    return mutableContact
}

1 Ответ

0 голосов
/ 13 февраля 2019

Контакт не изменяется, потому что вы удаляете только значение из изменяемого массива, который вы создали.Вы должны присвоить это значение контакту после удаления его из labeledValueToChange следующим образом:

contact.setValue(labeledValueToChange, forKey: key)

Также, если вы хотите изменить исходный контакт, вы можете просто передать его функции напрямуюв качестве входного параметра.Я попробовал вашу функцию, и она работает так:

private func removeFromEditedContact<T:NSString>(labeledValueType:T, with key:String,from contact:inout CNMutableContact, at indexPath:IndexPath) -> CNMutableContact {

        //what detail are we seraching for in the contact
        if let searchingArray = contact.mutableArrayValue(forKey: key) as? [CNLabeledValue<T>] {

            let searchValue = searchingArray[indexPath.row].value
            //if detail is present in our mutable contact remove it
            var labeledValueToChange = contact.mutableArrayValue(forKey: key) as? [CNLabeledValue<T>]

            if let index = labeledValueToChange?.index(where: {$0.value == searchValue})  {
                labeledValueToChange?.remove(at: index)
            }


            contact.setValue(labeledValueToChange, forKey: key)
        }

        return contact
    }
...