Все данные представлены в одном ряду - PullRequest
0 голосов
/ 17 сентября 2018

, поскольку я новичок в swift, у меня возник вопрос по поводу моего кода, в чем именно заключается его проблема!У меня есть табличное представление, в которое я должен поместить некоторые данные, которые я получаю из API.Я использую alamofire и мойю.

Я вызываю этот функционал в своем виртуальном компьютере для запроса в Интернете:

class SmsPresenter
{
var view:SmsView?

func attachView(view: SmsView){
    self.view = view
}


func gettingEveyThing( aptId : String){
    ApiGenerator.request(targetApi: ApartemanService.getSmsInfo(aptId: aptId), responseModel: smsModelList.self, success: { (response) in
        self.view?.GettingEverthingSuccess(response: response.body)
    }) { (error) in
        print(error)
        self.view?.GettingEvethingFailed(errorMessage: "error")
    }
}

Это моя модель данныхчто я храню их здесь:

typealias smsModelList = [SmsModel]

struct SmsModel:Codable {
    var unitNo:Int?
    var unitPlaque:String?
    var billText:String?
    var contacts:[ContactsModel?]


}

struct ContactsModel:Codable
{
    var id :Int?
    var selected :Bool?
    var phoneNumber : String?
    var name : String?

}

И вот эта функция, когда я получаю 200 код состояния:

func GettingEverthingSuccess(response: smsModelList?) {
    print("getting evething success")
    guard let response = response else {
        return
    }
    self.data = response

    self.tableview.reloadData()}

Мои сокращения:

    var Presenter = SmsPresenter()
    var data : smsModelList?
    var Pphone : [String] = []
    var Nname : [String] = []
    var Iid : [Int] = []

заполнение таблицы:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell") as? SmsTableViewCell

    if let contacts = data?[indexPath.row].contacts
    {
        for eachmain in contacts
        {
            Pphone.append((eachmain?.phoneNumber)!)
            Nname.append((eachmain?.name)!)
            Iid.append((eachmain?.id)!)

        }
    }
 }

что именно не так с моим кодом: |!когда я запускаю код, он ставит первое число для первой строки, затем снова ставит второе число для первого ro, хотя он должен ставить второе число и другие числа для своей строки ячеек.

Photo

Api Response:

[
    {
        "contacts": [
            {
                "id": 9827,
                "selected": true,
                "phoneNumber": "00987684044",
                "name": "OWNER"
            }
        ],
        "unitNo": 1,
        "unitPlaque": "Jack",
        "billText": "TEXTTEXT"
    },
    {
        "contacts": [
            {
                "id": 10145,
                "selected": true,
                "phoneNumber": "098887776655",
                "name": "mmm"
            }
        ],
        "unitNo": 2,
        "unitPlaque": "mm",
        "billText": "TEXTTEXT"
    }
]

crashLog PPhoto

фото: фото

окончательный ответ на мой вопрос был комбинацией всех ответов

Ответы [ 5 ]

0 голосов
/ 17 сентября 2018

Первый сбой, который вы получили из-за принудительного развертывания значения data.

вы можете вернуть счетчик данных, используя nil

data.count ?? 0

В этом примере кажется, что вы перебираете значениявнутри tableView(_:cellForRowAt:).Это не очень хорошая идея, потому что этот метод будет вызываться много раз для отображения таблицы.Удалите из очереди и настройте ячейку внутри блока cellForRow и сразу же верните ячейку.

Сначала заполните данные в нужном вам формате.

func GettingEverthingSuccess(response: smsModelList?) {
     print("getting evething success")
     guard let response = response else { return }

     let contacts = response.flatMap { $0.contacts }
     for contact in contacts {
          Pphone.append(contact.phoneNumber!)
          Nname.append(contact.name!)
          Iid.append(contact.id!)
     }
     self.tableview.reloadData()
}

func numberOfSections(in tableView: UITableView) -> Int {
    return data.count ?? 0
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    guard let data = data else { return }
    return data.contacts.count
}

func tableView( tableView : UITableView,  titleForHeaderInSection section: Int)->String {
     return data?[section].unitPlaque ?? ""
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell") as? SmsTableViewCell
    if let data = data, let contacts = data[indexPath.section].contacts, let contact = contacts[indexPath.row] {
       cell.phoneNumber = contact.phoneNumber!
       // ... more
    }
}
0 голосов
/ 17 сентября 2018

Для заполнения ваших данных в первую очередь верните numberOfRowsInSection.

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

Также, как вы сказали, ваше приложение рухнуло при возврате data.count, затем убедитесь, что во время перезагрузки таблицы ваша переменная "data" должна быть массивом.

0 голосов
/ 17 сентября 2018

Вы заполняете Table View неправильно. Для начала необходимо добавить количество разделов в табличном представлении:

 func numberOfSections(in tableView: UITableView) -> Int {
    return data.count
}

Затем вам нужно добавить количество строк в разделе

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

Тогда табличное представление должно быть заполнено так

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "SmsCell") as? SmsTableViewCell

    cell.yourLabelInsideCell.text = Nname[indexPath.row]
    cell.otherLabelInsideCell.text = Pphone[indexPath.row]
    cell.idLabelInsideCell.text = Iid[indexPath.row]
    // etc
}

Также вам необходимо сопоставить ваш ответ с вашими переменными при получении запроса:

func GettingEverthingSuccess(response: smsModelList?) {
     print("getting evething success")
     guard let response = response else {
        return
     }
     self.data = response


     for contactData in data {
         if let contacts = contactData.contacts {
            for eachmain in contacts {
               Pphone.append(eachmain.phoneNumber!)
               Nname.append(eachmain.name!)
               Iid.append(eachmain.id!)
            }   
        }
    }
     self.tableview.reloadData()
}

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

0 голосов
/ 17 сентября 2018

используйте приведенный ниже код (т.е. мы должны проверить, имеет ли массив данных какие-либо значения или нет)

   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if data != nil {
            return data.count
         }
   }
0 голосов
/ 17 сентября 2018

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

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