2017-01-11 4 views
0

Ich versuche, eingebettete Tabellenansichten zu integrieren, wo die UITableViewCell des übergeordneten UITableView eine andere benutzerdefinierte Tabellenansicht enthält. Ich kann den anderen Inhalt der übergeordneten Tabellenansichtszelle (z. B. die Beschriftung und eine Bildansicht) auffüllen. Das untergeordnete Element UITableView wird jedoch nicht mit seinem Inhalt gefüllt und bleibt leer. Dies ist der Code aus dem Haupt UIViewController, dass die „Eltern“ des Mutter ist UITableView:So erstellen Sie eine benutzerdefinierte Tabellenansicht innerhalb einer anderen benutzerdefinierten Tabellenansicht in swift

//table view delegate function 
    func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "completedOrdersCell", for: indexPath) as! CompletedOrdersTableViewCell 
     let currentOrder = completedOrders[indexPath.row] 
     cell.orderDate.text = dateToString(date: currentOrder.date) 
     cell.orderTime.text = dateToTimeToString(date: currentOrder.date) 
     cell.totalAmountPaid.text = "R\(String(format: "%.2f", currentOrder.totalCost))" 
     cell.driverProfile.image = currentOrder.driverProfile 
     cell.driverName.text = currentOrder.driverName 
     cell.restaurantLocation.text = currentOrder.restaurantLocation 
     cell.dropOffAddress.text = currentOrder.dropOffAddress 
     cell.mealsJSON = currentOrder.mealsJSON 
     cell.deliveryFee.text = "R\(currentOrder.deliveryFee)" 
     cell.tip.text = "R\(String(format: "%.2f", Double(currentOrder.driverTip)))" 
     return cell 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     completedOrderTableView.deselectRow(at: indexPath, animated: false) 
    } 

Hier mein Code in der übergeordneten TableViewCell ist:

@IBOutlet var mealsTableView: UITableView! 
    var mealsJSON = "" 

    struct Meal{ 
     var quantity = Int() 
     var name = "" 
     var price = Double() 
    } 
    var meals = [Meal]() 

    func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "mealCell", for: indexPath) as! completedMealTableViewCell 
     let currentMeal = meals[indexPath.row] 
     cell.quantity.text = "\(currentMeal.quantity)" 
     cell.name.text = currentMeal.name 
     cell.amount.text = "R\(String(format: "%.2f", currentMeal.price))" 
     return cell 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
     mealsTableView.delegate = self 
     mealsTableView.dataSource = self 
     print(mealsJSON) 
     jsonToMeal() 
    } 

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

     // Configure the view for the selected state 
    } 

    func jsonToMeal(){ 
     //set meals to data 
     let mealJSONData = mealsJSON.data(using: String.Encoding.utf8) 
     let readableJSON = JSON(data: mealJSONData!) 
     //extract array from JSON 
     for item in readableJSON["meals"].arrayValue{ 
      var newMeal = Meal() 
      newMeal.quantity = item["mealQuantity"].intValue 
      print(newMeal.quantity) 
      newMeal.name = item["mealName"].stringValue 
      print(newMeal.name) 
      newMeal.price = item["mealPrice"].doubleValue 
      print(newMeal.price) 
      meals.append(newMeal) 
     } 
     mealsTableView.reloadData() 
    } 

Hier wird der Code des Kindes UITableViewCell:

class completedMealTableViewCell: UITableViewCell { 

    @IBOutlet var quantity: UILabel! 
    @IBOutlet var name: MarqueeLabel! 
    @IBOutlet var amount: UILabel! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

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

     // Configure the view for the selected state 
    } 

} 
+0

Was ist der Wert von 'meals.count', wenn Sie es zurückgeben? –

+0

um Ihre Frage zu beantworten, brauchen wir auch den Code für das eingebettete TableView – muescha

+0

Ich sehe keine TableView innerhalb der Zelle (von Ihrem aktuellen Code) – muescha

Antwort

0

Erstens glaube ich, dass es eine bessere Idee ist, wenn Sie den Code zu trennen, eine Datei für Sie Tableview und eine für Sie TableViewCell. Implementieren Sie dann in Ihrer TableViewCell die UITableViewDelegate und UITableViewDataSource. Erstellen Sie außerdem den Ausgang für diese TableView.

// 
// NewTableViewCell.swift 
// JustATest 
// 
// Created by Alisson Enz Rossi on 1/11/17. 
// Copyright © 2017 com.Cotival.justATest. All rights reserved. 
// 

import UIKit 

class NewTableViewCell: UITableViewCell { 

    @IBOutlet var tableView: UITableView! 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     self.tableView.delegate = self 
     self.tableView.dataSource = self 
    } 

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

     // Configure the view for the selected state 
    } 
} 
extension NewTableViewCell: UITableViewDelegate, UITableViewDataSource { 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "id", for: indexPath) 

     //... 

     return cell 
    } 

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

} 

Erstellen Sie außerdem ein Array, das Sie das Tableview füllen können, das gleiche wie Sie in Ihrer Mutter Controller haben, und vergessen Sie nicht numberOfRowsInSection zu ändern, um die Anzahl der Elemente im Array zu zählen. Es sollte funktionieren.

Verwandte Themen