2017-04-10 2 views
1

탐색 컨트롤러에 사용자 지정 탭 호출기를 구현하는 방법에 대한 자습서를 읽었습니다. 내 설정은 다음과 같습니다. 오른쪽의 BuyStatsTapPager에서 "구매"와 "컨테스트"사이를 전환 할 수 있음을 알 수 있습니다.스위프트 - 탐색 컨트롤러의 사용자 지정 탭 호출기를 통해 데이터를 전달할 수 없습니다.

enter image description here

이 기본적으로 클릭하는 아이 탭에 따라 뷰 컨트롤러를 인스턴스화하여 작동합니다. 문제는 또한이 클래스에 데이터가 있다는 것입니다 (인스턴스 컨트롤러에 전달할 필요가있는 이전 뷰 컨트롤러에서 'segue 메서드를 준비하는'var selectedPlayerBuyStats '를 성공적으로 설정했습니다).

아래쪽에서 '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) 
    } 
} 


} 

편집 :

그래서 내가 탭 호출기 클래스 SEGUE하지만 여전히 가진 문제에 대비 사용하려고 해요. 1. 데이터를 가져올 하위 클래스를 확인하는 방법을 모르겠습니다. 2. 첫 번째 하위 클래스에 이처럼 보낸 경우에도 데이터는 여전히 다른 쪽에서는 nil입니다.

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

답장을 보내 주셔서 감사합니다. 나는 시도 할 것이지만 나는 segue 식별자가 없기 때문에 조금 혼란 스럽다. –

+0

viewContestTab 변수를 게으르지 않게 만드십시오. – Timmy

답변

0

의견에 따라 정확한 답변을 얻을 수있었습니다. 난 그냥 updateView()에서 더 아래로 대신 게으른 변수 viewContestTab 내부에 데이터를 설정했다. 자습서를 통해 거기에서 tableview에 액세스 할 수 있기 때문에 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 
}() 
관련 문제