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
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.
Sie müssen sich für segue die Daten über vorbereiten passieren wie du es getan hast 'var selectedPlayerBuyStats' Wert erhalten geben. – MwcsMac
Danke für die Antwort. Ich werde es versuchen, aber ich bin immer noch ein wenig verwirrt, weil ich keinen Nachnamen habe. –
Versuchen Sie, die Variable viewContestTab nicht faul zu machen – Timmy