2016-08-12 2 views
2

У меня есть TabBar с одним видом типа UIViewController. В этом представлении я добавил два контейнера (один для предстоящих поставок и один для завершенных поставок). Каждый из этих двух контейнеров связан с UITableViewController для отображения таблиц соответствующих заказов. Для доступа к контейнерам у меня есть сегментированный элемент управления.Swift - Передача данных из контейнера в TableViewController с использованием Segue

Я до сих пор не могу со всеми попытками, основанными на коде, и подходит для передачи данных с viewcontroller в tableviewcontrller. Я что-то упускаю?

Вот код, у меня есть в контроллере представления:

@IBOutlet weak var ordersSegementedControl: UISegmentedControl! 
@IBOutlet weak var upcomingDeliveriesContainer: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     SwiftLoader.show(title: "Retrieving Orders...", animated: true) 
     let currentUser = FIRAuth.auth()?.currentUser 
     ref.child("ordersSummary").queryOrderedByChild("userId").queryEqualToValue("\(currentUser!.uid)").queryLimitedToLast(15).observeEventType(.ChildAdded, withBlock: { (snapshot) in 

      if(snapshot.value!["orderStatus"] as? String != "In Progress" || snapshot.value!["orderStatus"] as? String != "Pending") 
      { 
       let tempOrderObject = OrderObject() 
       //let properDate: UnixTime = snapshot.value!["dueDate"] as! Int 
       tempOrderObject.dueDateInt = snapshot.value!["dueDate"] as? Int 
       let properDate: UnixTime = snapshot.value!["dueDate"] as! Int 
       tempOrderObject.dueDate = properDate.toDay 
       tempOrderObject.referenceNumber = snapshot.value!["orderReference"] as? String 
       tempOrderObject.status = snapshot.value!["orderStatus"] as? String 
       tempOrderObject.userId = snapshot.value!["userId"] as? String 
       tempOrderObject.sender = snapshot.value!["sender"] as? String 
       self.ordersObjectsArrray.append(tempOrderObject) 
       self.ordersObjectsArrray.sortInPlace({ $0.dueDate > $1.dueDate }) 
       SwiftLoader.hide() 
      } 

     }){ (error) in 
      SwiftLoader.hide() 
      print(error.localizedDescription) 
     } 

    } 



    @IBAction func showComponent(sender: UISegmentedControl) { 
     if sender.selectedSegmentIndex == 0 { 
      UIView.animateWithDuration(0.5, animations: { 
       self.upcomingDeliveriesContainer.alpha = 1 
      }) 
     } else { 
      UIView.animateWithDuration(0.5, animations: { 
       self.upcomingDeliveriesContainer.alpha = 1 
      }) 
     } 
    } 


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 

     if(segue.identifier == "upcomingDeliveriesSegue") 
     { 
      let destinationVC = segue.destinationViewController as! UpcomingDeliveriesTableViewController 
      destinationVC.ordersObjectsArrray = self.ordersObjectsArrray 

     } 
    } 

Я тогда следующее в UpcomingDeliveriesTableViewController:

class UpcomingDeliveriesTableViewController : UITableViewController { 

    let ref = FIRDatabase.database().reference() 
    var ordersObjectsArrray:[OrderObject]? 
    let orderToPass = OrderObject() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print("Array Count: \(self.ordersObjectsArrray!.count)") 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: - Table view data source 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return ordersObjectsArrray!.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     // Configure the cell... 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UpcomingDeliveriesTableViewCell 

     let orderEntry = self.ordersObjectsArrray![indexPath.row] 
     cell.dueDateLabel.text = String(orderEntry.dueDate) 
     cell.orderNoLabel.text = orderEntry.referenceNumber 
     cell.statusLabel.text = orderEntry.status 
     cell.senderLabel.text = orderEntry.sender 

     return cell 
    } 



} 

оператор печати в UpcomingDeliveriesTableVieController печати 0 в качестве счетчика массива Предметы. До сих пор не передается.

Это, наконец, раскадровка снимок:

the embed segue is called: upcomingDeliveriesSegue

Спасибо

+0

Проверить, если вы в ordersObjectsArrray Повторная инициализация UpcomingDeliveriesTableVieController ?? –

+0

Я делаю это: var ordersObjectsArrray = [OrderObject]() @VishalSonawane –

+0

@VishalSonawane извините, не получилось, что –

ответ

1

В prepareForSegue сохранить только экземпляр UpcomingDeliveriesTableViewController, но ordersObjectsArrray установить только тогда, когда вы его получите.

Ex:

в контроллере представления:

var tvc: UpcomingDeliveriesTableViewController! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    SwiftLoader.show(title: "Retrieving Orders...", animated: true) 
    let currentUser = FIRAuth.auth()?.currentUser 
    ref.child("ordersSummary").queryOrderedByChild("userId").queryEqualToValue("\(currentUser!.uid)").queryLimitedToLast(15).observeEventType(.ChildAdded, withBlock: { (snapshot) in 

     if(snapshot.value!["orderStatus"] as? String != "In Progress" || snapshot.value!["orderStatus"] as? String != "Pending") 
     { 
      let tempOrderObject = OrderObject() 
      //let properDate: UnixTime = snapshot.value!["dueDate"] as! Int 
      tempOrderObject.dueDateInt = snapshot.value!["dueDate"] as? Int 
      let properDate: UnixTime = snapshot.value!["dueDate"] as! Int 
      tempOrderObject.dueDate = properDate.toDay 
      tempOrderObject.referenceNumber = snapshot.value!["orderReference"] as? String 
      tempOrderObject.status = snapshot.value!["orderStatus"] as? String 
      tempOrderObject.userId = snapshot.value!["userId"] as? String 
      tempOrderObject.sender = snapshot.value!["sender"] as? String 
      self.ordersObjectsArrray.append(tempOrderObject) 
      self.ordersObjectsArrray.sortInPlace({ $0.dueDate > $1.dueDate }) 
      SwiftLoader.hide() 
     } 

    tvc.ordersObjectsArrray = self.ordersObjectsArrray 

    }){ (error) in 
     SwiftLoader.hide() 
     print(error.localizedDescription) 
    } 

} 


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 

    if(segue.identifier == "upcomingDeliveriesSegue") 
    { 
     tvc = segue.destinationViewController as! UpcomingDeliveriesTableViewController 
    } 
} 
+0

Не совсем понимаю, что вы говорите Igor –

+0

'prepareForSegue' выполняется раньше, тогда вы получаете' self.ordersObjectsArrray' в 'observEventType', понимаете? – Igor

+0

и в подготовительной форме выше, мы создаем новую переменную tvc, а что? Как передать его следующему виду? –

Смежные вопросы