因为我是新手,所以我对我的代码有疑问,这到底是什么问题!我有表视图,应该放一些从API获取的数据。我正在使用alamofire和moya。
我在我的vc中调用此func来请求Web:

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)!)

        }
    }
 }
我的代码到底有什么问题:| !当我运行代码时,它将第一个数字放在第一行,然后再次将第二个数字放在第一行,尽管它应该将第二个数字和其他数字放在该单元格行中。

Api响应:
[
    {
        "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
照片:
Photo
我的最终答案是所有答案的组合

最佳答案

由于强制展开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
    }
}

10-08 09:35
查看更多