Создание tableView внутри tableView - PullRequest
1 голос
/ 15 января 2020

Я создал tableView с ячейками-прототипами. Внутри каждой из этих ячеек-прототипов находится другой табличный вид с разными ячейками-прототипами. Я все это хорошо связал, но у меня возникли проблемы с изменением внутренних прототипных ячеек. Вот почему. Вот соответствующий код:

class ViewController: UIViewController, AVAudioRecorderDelegate, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
 override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "outerCell") as! outerCell
//would obviously make some modification to cell here, like cell.title = "test" or something
            let cell2 = cell.commentTableView.dequeueReusableCell(withIdentifier: "innerCell") as! innerCell
            cell2.commentText.text = "sus"

        //NEED TO DIFFERENTIATE HERE ON HOW TO KNOW WHICH CELL TO RETURN
//e.g. NEED TO RETURN either cell1 or cell2, depending on the tableView

    }

Мой код для externalCell выглядит следующим образом:

import UIKit

class outerCell: UITableViewCell, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var commentTableView: UITableView!


    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        commentTableView.delegate = self
        commentTableView.dataSource = self

    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "innerCell", for: indexPath) as! commentCell
        return cell
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }


}

Видите, основная проблема в том, что оба этих табличных представления работают нормально и все, но, в первом фрагменте кода, если я просто сделаю что-то вроде

if tableView == self.tableView{
    return cell }
else ...

, это не будет работать, поскольку tableView всегда выглядит как self.tableView.

Как я могу изменить свой код, чтобы я мог влиять на текст, отображаемый во внутренней ячейке и во внешней ячейке, в одном и том же блоке кода?

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

Спасибо, любая помощь будет принята.

1 Ответ

1 голос
/ 15 января 2020

вам нужно сначала создать два разных класса ячеек. Во внешнем классе:

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SearchPreferredJobTableViewCell
            cell.responseCreateBookingObj = { [unowned self] (returnObject) in
            DispatchQueue.main.async {
                    tableView.beginUpdates()
                    }
// do your logic

            DispatchQueue.main.async {
                        cell.contentView.layoutIfNeeded()
                        tableView.endUpdates()
                    } }

       return cell 
}

// другой класс ячейки. Объявляем переменную

var responseCreateBookingObj : APIServiceSuccessCallback?

// отправляем обратный вызов, от которого вы хотите отправить

guard let callBack = self.responseCreateBookingObj else{
        return
    }
    callBack(true as AnyObject)

// также делать, когда пользователь прокручивает, он будет управлять

tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath){
 DispatchQueue.main.async {
                    tableView.beginUpdates()
                    }

// делать логи c

        DispatchQueue.main.async {
                    cell.contentView.layoutIfNeeded()
                    tableView.endUpdates()
                }

}

...