2017-04-10 2 views
1

Ich habe ein Tutorial über die Implementierung eines benutzerdefinierten Tab Pagers in einem Navigationscontroller ausgeführt. Mein Setup sieht so aus. Auf dem BuyStatsTapPager (rechts) sollten Sie sehen, dass Sie zwischen "Buy" und "Contest" wechseln können.Swift - Daten können nicht über den benutzerdefinierten Tab Pager im Nav Controller übertragen werden

enter image description here

Dies funktioniert im Grunde durch View-Controller instanziieren je nach Registerkarte welchem ​​Kind geklickt wird. Das Problem ist, dass ich auch Daten in dieser Klasse habe (ich habe erfolgreich 'var selectedPlayerBuyStats' aus der vorherigen Ansicht Controller für die Methode vorbereiten vorbereiten), die ich an die instanziierten Controller übergeben muss.

Unten in 'updateView()' Ich dachte, ich hatte einen Weg herausgefunden, weil ich in der Lage bin, auf die View-Controller Tableview zuzugreifen, um seine Größe und Dimension festzulegen. Ich habe die Zeilen auskommentiert, die nicht funktionieren. Die IDE findet die Eigenschaft erfolgreich von den Child-View-Controllern, die ich einstellen muss, aber wenn ich tatsächlich versuche, die Daten im Child-View-Controller zu erhalten, ist nil. Gibt es eine andere Möglichkeit, wie ich das vielleicht versuchen könnte? Dank

import UIKit 



class BuyStatsTabPager: BuyStats{ 


@IBOutlet var segmentedControl: UISegmentedControl! 
@IBOutlet weak var scoreKey: UIBarButtonItem! 
@IBOutlet weak var standings: UIBarButtonItem! 

var selectedPlayerBuyStats: Player! = nil 

override func viewDidLoad() { 

    navigationController?.navigationBar.barTintColor = UIColor(red: 27/255, green: 27/255, blue: 27/255, alpha: 1) 

    scoreKey.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Helvetica", size: 13.0)!], for: UIControlState.normal) 
    scoreKey.tintColor = UIColor.blue 

    standings.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Helvetica", size: 13.0)!], for: UIControlState.normal) 
    standings.tintColor = UIColor.blue 


    setupView() 
} 

private func setupView() { 
    setupSegmentedControl() 
    updateView() 
} 

private func setupSegmentedControl() { 
    // Configure Segmented Control 
    segmentedControl.removeAllSegments() 
    segmentedControl.insertSegment(withTitle: "Buy", at: 0, animated: false) 
    segmentedControl.insertSegment(withTitle: "Score", at: 1, animated: false) 
    segmentedControl.addTarget(self, action: #selector(selectionDidChange(_:)), for: .valueChanged) 
    segmentedControl.selectedSegmentIndex = 0 
} 

func selectionDidChange(_ sender: UISegmentedControl) { 
    updateView() 
} 


private lazy var viewContestTab: BuyStatsTab = { 
    // Load Storyboard 
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) 

    // Instantiate View Controller 
    var viewController = storyboard.instantiateViewController(withIdentifier: "BuyStatsTab") as! BuyStatsTab 


    // Add View Controller as Child View Controller 
    self.add(asChildViewController: viewController) 

    return viewController 
}() 

private lazy var viewRoundTab: BuyStatsContestTab = { 
    // Load Storyboard 
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) 

    // Instantiate View Controller 
    var viewController = storyboard.instantiateViewController(withIdentifier: "BuyStatsContestTab") as! BuyStatsContestTab 




    // Add View Controller as Child View Controller 
    self.add(asChildViewController: viewController) 

    return viewController 
}() 

private func add(asChildViewController viewController: UIViewController) { 
    // Add Child View Controller 
    addChildViewController(viewController) 

    // Add Child View as Subview 
    view.addSubview(viewController.view) 

    // Configure Child View 
    viewController.view.frame = view.bounds 
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] 

    // Notify Child View Controller 
    viewController.didMove(toParentViewController: self) 
} 

private func remove(asChildViewController viewController: UIViewController) { 
    // Notify Child View Controller 
    viewController.willMove(toParentViewController: nil) 

    // Remove Child View From Superview 
    viewController.view.removeFromSuperview() 

    // Notify Child View Controller 
    viewController.removeFromParentViewController() 
} 

private func updateView() { 
    if segmentedControl.selectedSegmentIndex == 0 { 

     //this is working so I have the data I need to pass 
     print(selectedPlayerBuyStats.p) 

     let position = viewRoundTab.tableView.contentOffset.y; 
     viewContestTab.tableView.contentOffset = CGPoint(x:0, y:position); 

     //but it isn't working this way 
     //viewContestTab.selectedPlayer = selectedPlayerBuyStats 


     remove(asChildViewController: viewRoundTab) 
     add(asChildViewController: viewContestTab) 
    } else { 


     print(selectedPlayerBuyStats.Name) 

     let position = viewContestTab.tableView.contentOffset.y; 
     viewRoundTab.tableView.contentOffset = CGPoint(x:0, y:position); 

     //viewRoundTab.selectedPlayer = selectedPlayerBuyStats 

     remove(asChildViewController: viewContestTab) 
     add(asChildViewController: viewRoundTab) 
    } 
} 


} 

EDIT:

Also ich versuche, in der Registerkarte Pager-Klasse für segue vorbereiten zu verwenden, aber nach wie vor Probleme. 1. Ich weiß nicht, wie ich überprüfen soll, in welche Kindklasse die Daten gehen sollen. 2. Auch wenn ich einfach so an die erste Kindklasse sende, sind die Daten auf der anderen Seite immer noch Null.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 


     let buyStats = segue.destination as! BuyStatsTab 

     buyStats.selectedPlayer = selectedPlayer 


} 

Hier ist der erste der Empfänger Kind View-Controller.

class BuyStatsTab: UIViewController, UITableViewDelegate, UITableViewDataSource{ 

@IBOutlet var tableView: UITableView! 

let cellReuseIdentifier = "cell" 

var stats = [BuyStat]() 

var selectedPlayer: Player! = nil 


override func viewDidLoad() { 
    super.viewDidLoad() 

    self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier) 
    self.tableView.rowHeight = 70.0 
    self.tableView.tableFooterView = UIView() 
    tableView.delegate = self 
    tableView.dataSource = self 


    stats = [ 
      BuyStat(purchaseAmount: 0.0, category: "Pts", average: selectedPlayer.p, price: "$75"), 
      BuyStat(purchaseAmount: 0.0, category: "Reb", average: 6.5, price: "$175"), 
      BuyStat(purchaseAmount: 0.0, category: "Ast", average: 6.7, price: "$200"), 
      BuyStat(purchaseAmount: 0.0, category: "Stl", average: 2.2, price: "$300"), 
      BuyStat(purchaseAmount: 0.0, category: "Blk", average: 0.4, price: "$325"), 
      BuyStat(purchaseAmount: 0.0, category: "3pt", average: 3.3, price: "$325"), 
      BuyStat(purchaseAmount: 0.0, category: "TO", average: 2.4, price: "$350")] 

    tableView.reloadData() 

} 

selectedPlayer.p im Array sollte Daten haben.

+0

Sie müssen sich für segue die Daten über vorbereiten passieren wie du es getan hast 'var selectedPlayerBuyStats' Wert erhalten geben. – MwcsMac

+0

Danke für die Antwort. Ich werde es versuchen, aber ich bin immer noch ein wenig verwirrt, weil ich keinen Nachnamen habe. –

+0

Versuchen Sie, die Variable viewContestTab nicht faul zu machen – Timmy

Antwort

0

Basierend auf den Kommentaren konnte ich die genaue Antwort erhalten. Ich musste nur die Daten innerhalb der Lazy-Variablen viewContestTab setzen, anstatt weiter unten in updateView(). Ich dachte, es in updateView() zu tun, würde funktionieren, weil das Tutorial mich von dort auf die Tabellenansicht zugreifen ließ. Ich bin mir immer noch nicht sicher, warum ich auf die Tabellenansicht in updateView() zugreifen kann, aber die anderen Daten nicht einstellen. Wenn jemand denkt, dass dies eine bessere Erklärung verdient, gebe ich ihnen gerne die beste Antwort.

private lazy var viewRoundTab: BuyStatsContestTab = { 

    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) 

    var viewController = storyboard.instantiateViewController(withIdentifier: "BuyStatsContestTab") as! BuyStatsContestTab 

    viewController.selectedPlayer = self.selectedPlayerBuyStats 

    self.add(asChildViewController: viewController) 

    return viewController 
}() 
Verwandte Themen