2017-04-10 3 views
1

ナビゲーションコントローラにカスタムタブページャを実装する方法に関するチュートリアルに続きました。私のセットアップは次のようになります。 BuyStatsTapPager(右側)には、「購入」と「コンテスト」を切り替えることができます。Swift - Navコントローラのカスタムタブページャでデータを渡すことができない

enter image description here

これは基本的にタブがクリックされた子に応じて、ビューコントローラをインスタンス化することによって動作します。問題は、私はインスタンス化されたコントローラに渡す必要がある、このクラスのデータも持っていることです(私は正常に '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にはデータが必要です。

+0

「var selectedPlayerBuyStats」の値を渡すのと同じように、セグを準備するためにデータを渡す必要があります。 – MwcsMac

+0

返事をありがとう。私は試してみますが、私はセグの識別子を持っていないので、少し混乱しています。 –

+0

viewContestTab変数を怠惰ではないようにしてください。 – Timmy

答えて

0

コメントに基づいて私は正確な答えに到達できました。私はちょうどupdateView()のさらに下にではなく、遅延変数viewContestTabの内部にデータを設定しなければなりませんでした。チュートリアルで私がそこからテーブルビューにアクセスしてくれたので、updateView()でそれをやっているとうまくいくと思いました。私はまだupdateView()でtableviewにアクセスできますが、他のデータは設定できないのかどうかは分かりません。もし誰かがこれがより良い説明に値すると思うなら、私は喜んで彼らに最高の答えを与えるでしょう。

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 
}() 
関連する問題