由于我是新手,所以我对我的代码有疑问,这到底是什么问题!我有表视图,应该放一些从API获取的数据。我正在使用alamofire和moya。
我在我的vc中将此函数称为,以请求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"
}
]
照片: Photo
我的最终答案是所有答案的组合
答案 0 :(得分:1)
您错误地填充了表视图。 首先,您需要在表格视图中添加节数:
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()
}
不要忘记变量应该以小写字母开头...
答案 1 :(得分:0)
您是否添加了numberOfRowsInSection,并且传递的值是什么?根据您的代码,它需要像下面的代码
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
答案 2 :(得分:0)
使用以下代码(即,我们必须检查数据数组是否具有任何值)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if data != nil {
return data.count
}
}
答案 3 :(得分:0)
首先填充数据,然后返回numberOfRowsInSection。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
也正如您所说的,我们的应用程序在返回data.count时崩溃了,然后确保在表重新加载期间,变量“ data”应为数组。
答案 4 :(得分:0)
由于强制展开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
}
}