ナビゲーションコントローラにカスタムタブページャを実装する方法に関するチュートリアルに続きました。私のセットアップは次のようになります。 BuyStatsTapPager(右側)には、「購入」と「コンテスト」を切り替えることができます。Swift - Navコントローラのカスタムタブページャでデータを渡すことができない
これは基本的にタブがクリックされた子に応じて、ビューコントローラをインスタンス化することによって動作します。問題は、私はインスタンス化されたコントローラに渡す必要がある、このクラスのデータも持っていることです(私は正常に 'var selectedPlayerBuyStats'を以前のView ControllerでSegueメソッドの準備からセットしました)。
'updateView()'の一番下には、サイズと寸法を設定するために子ビューコントローラtableviewにアクセスできるので、私は考え方があると思っていました。私は、コメントアウトされている行は動作していません。 IDEは、設定が必要な子ビューコントローラのプロパティを正常に見つけることができましたが、子ビューコントローラのデータを実際にはゼロにすることを試みました。おそらくこれをやろうとすることができる別の方法はありますか?おかげ
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:
だから私は、タブページャクラスでセグエの準備に使用しようとしているが、まだ問題を抱えて。 1.データをどの子クラスに送るべきかを調べる方法はわかりません。 2.これを最初の子クラスに送信しても、データはまだ相手側ではゼロです。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let buyStats = segue.destination as! BuyStatsTab
buyStats.selectedPlayer = selectedPlayer
}
ここは、受信者の子ビューコントローラの最初のものです。
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にはデータが必要です。
「var selectedPlayerBuyStats」の値を渡すのと同じように、セグを準備するためにデータを渡す必要があります。 – MwcsMac
返事をありがとう。私は試してみますが、私はセグの識別子を持っていないので、少し混乱しています。 –
viewContestTab変数を怠惰ではないようにしてください。 – Timmy