Добавление текста из uitextfield в uitableview


#1

Есть текстфилд отдельно от таблицы (расположен не в ячейке таблицы), но на этом же контроллере. Необходимо, чтобы при вводе слова, уже с первой буквы, эта буква и последующие набираемые автоматически сразу отображались в лэйбле расположенном в ячейке таблицы, в процессе написания. А так же отображались все доступные слова из массива с этими же буквами (те добиться того, чтобы таблица предлагала выбор слов из массива с таким порядком букв как введеные. Но в таблице отображаться должно вводимое слово и примеры для выбора только после начала ввода слова. С первой задачей справился, код в вопросе подправил, а с фильтром слов для выбора пока не получается. заранее спасибо

@IBOutlet weak var checkTextField: UITextField!
var tableData = ["арбуз", "баклажан", "вино", "груша", "жимолость", "зерно", "иголка", "кружка", "лампа", "машина"]
var filterThing = [""]

@objc func textFieldDidChange(_ textField: UITextField) {
     textFieldText = checkTextField.text

     let filtered = tableData.filter {$0.lowerCased().contains(textFieldText.lowerCased())}//НЕ ПРАВИЛЬНО РЕАЛИЗУЮ ФИЛЬТР
     filterThing.append(contentsOf: filtered)

     tableView.reloadData()
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return filterThing.count + 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "detailCell") as! DetailCell

    if (indexPath as NSIndexPath).section == 0 && (indexPath as NSIndexPath).row == 0 {
        cell.thingNameLabel?.text = textFieldText
    } else if (indexPath as NSIndexPath).section == 0 && (indexPath as NSIndexPath).row > 0 {
        cell.thingNameLabel?.text = filterThing[indexPath.row]
    }

    return cell
}

#2

Во-первых, у вас не верно указано кол-во элементов для талицы. Там будет кол-во найденных слов + 1 (это как раз то, что введете в textField). Следовательно кол-во элементов нужно хранить в отдельной переменной, которая будет обновляться и после чего обновлять tableView. Изначально в этой переменной будет 0.
Во-вторых, добавьте себе делегат от textField’a, что бы отлавливать ввод текста. После каждой введенной буквы или удаленной, вызывать метод, который будет производить поиск, обновлять кол-во элементов для таблицы. Тут так же будет создаваться новый массив, который будет содержать ввеленный текст + подходящие слова и первого массива. В конце метода вызовите tableView.reloadData() и просто заполните таблицу словами. В методе tableView(indexPath) уберите лишние действия. Тут будет только заполнение ячейки.
Дальше уже реализуете метод tableView(didSelect) для выбора из таблицы.


#3

С первой задачей разобрался, теперь вопрос в реализации “После каждой введенной буквы или удаленной, вызывать метод, который будет производить поиск, обновлять кол-во элементов для таблицы. Тут так же будет создаваться новый массив, который будет содержать введенный текст + подходящие слова из первого массива.” Как правильно реализовать фильтр? Спасибо


#4

Найдите метод поиска подстроки в строке и сравнивайте введенный текст с каждым словом из массива в нижнем регистре.


#5

А можешь более конкретно подсказать метод поиска подстроки в строке, подходящий к моей ситуации, чтобы искать именно в массиве? Спасибо


#6

Пожалуйста


#7

пытаюсь преобразовать к массиву, пытался нагуглить, не найду и знаний не хватает.
myString.range(of:“Swift”) для массива не подходит, чем заменить это выражение?


#8

У вас должно быть что-то такое:

filterThing = tableData.filter { $0.lowercased().range(of: mySearchString.lowercased() != nil }