탐색 컨트롤러에 사용자 지정 탭 호출기를 구현하는 방법에 대한 자습서를 읽었습니다. 내 설정은 다음과 같습니다. 오른쪽의 BuyStatsTapPager에서 "구매"와 "컨테스트"사이를 전환 할 수 있음을 알 수 있습니다.스위프트 - 탐색 컨트롤러의 사용자 지정 탭 호출기를 통해 데이터를 전달할 수 없습니다.
이 기본적으로 클릭하는 아이 탭에 따라 뷰 컨트롤러를 인스턴스화하여 작동합니다. 문제는 또한이 클래스에 데이터가 있다는 것입니다 (인스턴스 컨트롤러에 전달할 필요가있는 이전 뷰 컨트롤러에서 '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에는 데이터가 있어야합니다.
'var selectedPlayerBuyStats' 값을 전달한 것처럼 세그 준비를 통해 데이터를 전달해야합니다. – MwcsMac
답장을 보내 주셔서 감사합니다. 나는 시도 할 것이지만 나는 segue 식별자가 없기 때문에 조금 혼란 스럽다. –
viewContestTab 변수를 게으르지 않게 만드십시오. – Timmy