Ячейка TableView не обновляется после выбора элемента с использованием делегата Swift

Я пытаюсь реализовать метод делегата для элемента выбора. Я запутался в обновлении ячейки tableView. Поскольку у меня есть несколько разделов, и список будет тот, который будет использоваться для разных ячеек. Как я могу обновить строку или модель ячейки таблицы, чтобы перезагрузить таблицу?

Модель:


struct Unit : Codable {

    let sectionList : [SectionList]?

}
struct SectionList : Codable {

    let title : String?
    let items : [Item]?

}

struct Item : Codable {

    let actionType : Int?
    let actionUrl : String?
    let bgColor : String?
    let booleanValue : Bool?
    let textField : String?
    let textValue : String?
    let unitId : Int?
    let latitude : Double?
    let longitude : Double?
    let actionParamData: String?
    let actionTitle: String?
    let pickList: [SectionList]?
    let multiSelect: Bool?
    let selectedValue: [String]?
    let version: Int?
    let masterId: Int?
    let itemValue: String?
}



Фёрвьюконтроллер:

var AppData: Unit?

func listFunc(tvc2: ViewController, didSelectList listValue: String) {
        print(listValue)
        let indexPathRow:Int = 0
        let indexPosition = IndexPath(row: indexPathRow, section: 0)
        tableView.reloadRows(at: [indexPosition], with: .none)
    }

SecondViewController: (содержит список)

protocol ListDelegate {
    func listFunc(tvc2: ViewController, didSelectList listValue: String)
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let indexPath = tableView.indexPathForSelectedRow
        let currentCell = tableView.cellForRow(at: indexPath!)!
        //print(currentCell.textLabel?.text as Any)
        currentCell.accessoryType = .checkmark
        delegate?.listFunc(tvc2: self, didSelectList: currentCell.textLabel?.text ?? "")

        let vc = self.storyboard?.instantiateViewController(withIdentifier: "FirstViewController") as! FirstViewController
        self.navigationController?.pushViewController(vc, animated: true)


       }

person Community    schedule 02.12.2019    source источник
comment
Где вы устанавливаете первый контроллер представления в качестве делегата второго? Почему вы всегда перезагружаете строку 0?   -  person Paulw11    schedule 02.12.2019
comment
@Paulw11 установил делегата в secondViewController. var delegate: ListDelegate?   -  person    schedule 02.12.2019
comment
@ Paulw11 На самом деле простой сканер: мне нужно выбрать любой элемент из secondViewController и установить в FirstViewController. Как только элемент выбран, он обновляет ячейку.   -  person    schedule 02.12.2019
comment
Вот где вы делегируете делегата, но вам нужно где-то установить экземпляр вашего первого контроллера представления для этого свойства.   -  person Paulw11    schedule 02.12.2019
comment
@Paulw11 Paulw11 Я действительно новичок в этом и запутался, как установить? Могу ли я поделиться с вами своей github ссылкой?   -  person    schedule 02.12.2019
comment
Вам нужно установить делегата, где вы представляете второй контроллер представления (обычно в prepareForSegue). Также вам нужно вернуться к существующему контроллеру первого представления, а не представлять новый экземпляр e.   -  person Paulw11    schedule 02.12.2019
comment
На самом деле, вам, вероятно, не нужен шаблон делегирования. Вы просто обновляете состояние выбора элементов в своей модели данных, а затем перезагружаете табличное представление в viewWillAppear вашего первого vc.   -  person Paulw11    schedule 02.12.2019
comment
@ Paulw11 Могу я поделиться кодом? на самом деле я пытался, но не добился этого.   -  person    schedule 02.12.2019


Ответы (1)


Привет, вы немного смущены тем, как работает делегат. Здесь я изменяю ваш код. Предположим, у вас есть два viewController, то есть FirstViewController и SecondViewController, теперь вам нужно отправить данные обратно или перезагрузить данные из SecondViewController в FirstViewController. Итак, что вам нужно сделать, это создать Protocol на SecondViewController и подтвердить, что Protocol в FirstViewController. Ниже приведен пример вашего кода:

Фирствиевконтроллер

class FirstViewController: UIViewControlller, ListDelegate {

   var selectedIndex: Int?
   var selectedSection: Int?

   //Click event for navigation from FirstViewController to SecondViewController
   @IBAction func BackButtonAction(_ sender: Any) {
       let vc = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
       vc.delegate = self
       self.navigationController?.pushViewController(vc, animated: true)
   }

   func listFunc(listValue: String) {
       AppData?.sectionList?[selectedSection!].items?[selectedIndex!].textField = listValue
       tableView.reloadData()
   }

   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       //Add these two line in your code
       selectedIndex = indexPath.row
       selectedSection = indexPath.section
   } 
}

Секондвиевконтроллер

protocol ListDelegate {
    func listFunc(listValue: String)
}

class SecondViewController: UIViewControlller {
    var delegate: ListDelegate?

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let indexPath = tableView.indexPathForSelectedRow
        let currentCell = tableView.cellForRow(at: indexPath!)!
        //print(currentCell.textLabel?.text as Any)
        currentCell.accessoryType = .checkmark
        delegate?.listFunc(listValue: currentCell.textLabel?.text ?? "")
        self.navigationController?.popViewController(animated: true)
   }
}

Ответ.swift

//Change let to var for these
var textField : String?
var textValue : String?

Приведенный выше код может решить вашу проблему. Пожалуйста, попробуйте этот код. Happy To Help

person Shiv Jaiswal    schedule 02.12.2019
comment
Спасибо :) теперь работает. Еще одна вещь, чтобы узнать, как я могу перезагрузить tableview/model для этих изменений? - person ; 02.12.2019
comment
Метод @NewBieMobile listFunc в FirstViewController поможет перезагрузить ваш tableView. - person Shiv Jaiswal; 02.12.2019
comment
Да, это не перезагружает данные tableView. Такие же данные существуют и по отбору. - person ; 02.12.2019
comment
Хорошо, я понимаю проблему. Чтобы отразить ваше новое значение в tableViewCell, вам нужно сохранить его в другой переменной, а затем назначить его в методе cellForRowAt: index, или вы можете обновить свою модель данных непосредственно в методе listFunc. - person Shiv Jaiswal; 02.12.2019
comment
Спасибо, вот ссылка. github.com/MasamMahmood/SqliteDataList - person ; 02.12.2019
comment
Ссылка доступна? пожалуйста, подтвердите, и я думаю, что подход к модели данных будет хорошим, потому что после его отражения я повторно отправлю обновленные значения на сервер. - person ; 02.12.2019
comment
Ага, доступно. - person Shiv Jaiswal; 02.12.2019
comment
Я внес некоторые изменения в ваш код, но не могу нажать на код. - person Shiv Jaiswal; 02.12.2019
comment
На самом деле это полный общедоступный репозиторий со всеми разрешениями, которые я уже дал - person ; 02.12.2019
comment
Я обновил свой ответ здесь, посмотрите и измените соответственно. - person Shiv Jaiswal; 02.12.2019
comment
Спасибо отлично все сделано. Я обновил это: AppData?.sectionList?[selectedSection!].items?[selectedIndex!].textValue = listValue Небольшая проблема осталась, только если я нажму на верхнюю строку ячейки, она изменяет только последний раздел строки индекса, а не тот, который я щелкнул. - person ; 02.12.2019
comment
Спасибо Шив за вашу поддержку. Я починил это :) - person ; 02.12.2019
comment
Могу ли я задать один вопрос, связанный с параметрами публикации, поскольку я борюсь с передачей модели в качестве параметра в alamofire? Пожалуйста ... - person ; 05.12.2019