Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-Can';t通过导航控制器中的自定义选项卡寻呼机传递数据_Ios_Swift_Segue_Childviewcontroller - Fatal编程技术网

Ios Swift-Can';t通过导航控制器中的自定义选项卡寻呼机传递数据

Ios Swift-Can';t通过导航控制器中的自定义选项卡寻呼机传递数据,ios,swift,segue,childviewcontroller,Ios,Swift,Segue,Childviewcontroller,我学习了如何在导航控制器中实现自定义选项卡寻呼机的教程。我的设置看起来像这样。在BuyStatsTapPager(右侧)上,您应该看到可以在“购买”和“竞争”之间切换 这主要是通过根据单击的子选项卡实例化视图控制器来实现的。问题是我在这个类中也有数据(我已经成功地从前面的view controller prepare for segue方法中设置了“var selectedPlayerBuyStats”),我需要将这些数据传递给实例化的控制器 class BuyStatsTab: UIView

我学习了如何在导航控制器中实现自定义选项卡寻呼机的教程。我的设置看起来像这样。在BuyStatsTapPager(右侧)上,您应该看到可以在“购买”和“竞争”之间切换

这主要是通过根据单击的子选项卡实例化视图控制器来实现的。问题是我在这个类中也有数据(我已经成功地从前面的view controller prepare for segue方法中设置了“var selectedPlayerBuyStats”),我需要将这些数据传递给实例化的控制器

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()

}
在“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)
    }
}


}
编辑:

所以我尝试在tab pager类中使用prepare for segue,但仍然存在问题。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应包含数据

根据这些评论,我得到了确切的答案。我只需要在惰性变量viewContestTab中设置数据,而不是在updateView()中进一步设置数据。我认为在updateView()中这样做是可行的,因为教程让我从那里访问tableview。我仍然不确定为什么我可以在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
}()

根据这些评论,我得到了确切的答案。我只需要在惰性变量viewContestTab中设置数据,而不是在updateView()中进一步设置数据。我认为在updateView()中这样做是可行的,因为教程让我从那里访问tableview。我仍然不确定为什么我可以在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
}()

您需要通过prepare for segue传递数据,就像您通过prepare for segue传递
var selectedPlayerBuyStats
值一样。感谢您的回复。我会尝试,但我仍然有点困惑,因为我没有序列标识符。尝试使viewControlTab变量不懒惰看看这是否有帮助。@提米,谢谢你的回复。似乎这可能与子视图控制器的懒惰有关,但当我删除它时,在“self.add(asChildViewController:viewController)”下会出现错误。我得到“NSObject->()->BuyStatsTapPager类型的值没有成员添加”。我会继续尝试。你需要通过prepare for segue传递数据,就像你传递
var selectedPlayerBuyStats
值一样。谢谢你的回复。我会尝试,但我仍然有点困惑,因为我没有序列标识符。尝试使viewControlTab变量不懒惰看看这是否有帮助。@提米,谢谢你的回复。似乎这可能与子视图控制器的懒惰有关,但当我删除它时,在“self.add(asChildViewController:viewController)”下会出现错误。我得到“NSObject->()->BuyStatsTapPager类型的值没有成员添加”。我会继续尝试的。