【问题标题】:All the datas are presenting in one row所有数据都呈现在一行中
【发布时间】:2019-02-21 00:30:52
【问题描述】:

由于我是 swift 新手,我对我的代码有疑问,它到底是什么问题!我有表格视图,我应该放置一些从 API 获取的数据。我正在使用 alamofire 和 moya。

我在我的 vc 中调用这个函数来请求网络:

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:

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,尽管它应该将第二个数字和其他数字放入它们的单元格行。

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

我的最终答案是所有答案的组合

【问题讨论】:

  • 你没有序列化你的数据
  • cellForRowAt 会一次又一次地调用,因为它正在重用单元格,所以我认为这种方法不能在cellForRowAt 方法中附加数据。
  • 什么意思?我得到了数据,我可以展示它,但是方式错误
  • 我刚刚添加了一张照片
  • @DharmeshKheni 你有什么建议?

标签: ios swift uitableview alamofire moya


【解决方案1】:

您错误地填充了表格视图。 首先,您需要在表格视图中添加部分数量:

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

然后你需要在section中添加行数

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()
}

别忘了变量应该以小写字母开头...

【讨论】:

  • “条件绑定的初始化程序必须具有可选类型,而不是 '[ContactsModel?]'”是什么意思?我在 func gettingeverthingseccess 中得到了这个
  • 我刚刚编辑了我的答案,该警告现在将被删除
  • 我解开了可选的,因为我正在循环数据并且不需要再次解包。如果它解决了您的问题,请不要忘记将其标记为已接受 :)
  • 现在再试一次,因为我改变了一些东西以换取部分中的行数
  • 我刚刚添加了一张照片来告诉你错误仍然存​​在
【解决方案2】:

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

【讨论】:

  • 如果我只定义一个部分,它就可以工作。因为我需要 unitPlaque 作为我的部分标题,所以我遇到了一个荒谬的问题!我添加了照片
【解决方案3】:

您是否添加了 numberOfRowsInSection 以及您在其中传递的值是什么?根据您的代码,它需要像下面的代码

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

【讨论】:

  • 当我这样做时它崩溃了!!我不知道为什么!
  • @LalKrishna 线程 1:EXC_BREAKPOINT(代码=1,子代码=0x100a662d0)
  • 实际上我需要返回contact.count,因为每个unitPlaque 可以取任意数量的数字
【解决方案4】:

使用下面的代码(即我们必须检查数据数组是否有任何值)

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

【讨论】:

  • 这阻止了应用程序崩溃并且它可以工作,但是我的数据有2个元素,但我需要在所有元素中返回contact.count,我应该如何将它们全部扔掉
【解决方案5】:

首先要填充您的数据,返回 numberOfRowsInSection。

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

正如您所说,您的应用程序在返回 data.count 时崩溃,然后确保在表重新加载期间您的变量“数据”应该是一个数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-17
    • 2021-01-15
    • 2013-04-07
    • 2021-08-17
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多