Передача данных из ViewController в UITableViewController - PullRequest
0 голосов
/ 31 октября 2018

Помогите, пожалуйста, понять, чего мне не хватает?

Настройка раскадровки:

ViewController -> TabBarController -> NavigationController, который содержит TableViewController

Существует переход с идентификатором " startUp " от ViewController к TabBarController

ViewController - это экран начального ввода. ViewController имеет SegmentedControl и кнопку

ИСПОЛЬЗОВАНИЕ: пользователь выбирает один из сегментов и нажимает кнопку. Представление должно перейти к TableViewController и заменить NavigationItem.Title заголовком из сегмента SegmentedControl, который был выбран.

ПРОБЛЕМА: данные не передаются из ViewController в TableViewController (и через TabBarController и NavigationController). Я всегда заканчиваю с пустым заголовком заголовка на TableViewController. За последние несколько дней я внимательно просмотрел пару десятков инструкций, как здесь, так и в других местах в Интернете, используя segue и другие методы. На данный момент, кажется, ничего не работает, и у меня кружится голова (и, возможно, что-то упущено, действительно, очень просто).

Вот как код "сидит"

Код ViewController:

import UIKit

class ViewController: UIViewController {
    var someData: String? = ""

    @IBOutlet weak var cpChoice: UISegmentedControl!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func startBut(_ sender: Any) {
        performSegue(withIdentifier: "startUp", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        let theIndex = cpChoice.selectedSegmentIndex
        someData = cpChoice.titleForSegment(at: theIndex)

        print(someData!) //outputs correctly to console

        if segue.destination is CheckpointVC
        {
            let vc = segue.destination as? CheckpointVC
            vc?.data = someData!
        }
    }
}

TableViewController Code:

import UIKit

class CheckpointVC: UITableViewController {

    var data: String = ""

    @IBOutlet weak var theHeader: UINavigationItem!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.title = data
        //theHeader.title = data
    }


    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 0
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return 0
    }
}

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Просто замените целевой объект на контроллер навигации, который содержит ваш CheckpointVC в качестве контроллера корневого представления.

0 голосов
/ 03 ноября 2018

Решение

ЧАСТИ ОПРЕДЕЛЕНИЯ

The pieces

ViewController.swift

import UIKit

class ViewController: UIViewController {

    var someData: String? = ""

    @IBOutlet weak var cpChoice: UISegmentedControl!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func startBut(_ sender: Any) {
        performSegue(withIdentifier: "startUp", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        //get the string representing the segment chosen and assign it to someData
        let theSegmentChosen = cpChoice.selectedSegmentIndex
        someData = cpChoice.titleForSegment(at: theSegmentChosen)


        let barVC = segue.destination as! UITabBarController //
        let navigationControllerDestination = barVC.viewControllers?[0] as? navVC //the array index [0] indicates the first view controller belonging to the TabBarController
        let firstViewControllerOfNavigationController = navigationControllerDestination?.topViewController as! CheckpointVC
        firstViewControllerOfNavigationController.data = someData!
    }
}

TabBarVC

import UIKit

class TabBarVC: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
}

NavVC

import UIKit

class navVC: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

}

CheckpointVC.swift

import UIKit

class CheckpointVC: UITableViewController {

    //the variable we'll pass the data to from the starting viewcontroller
    var data: String = ""

    @IBOutlet weak var theHeader: UINavigationItem!

    override func viewDidLoad() {
        super.viewDidLoad()
        theHeader.title = data
    }


    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 0
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return 10
    }
}
0 голосов
/ 31 октября 2018

Вы установили точку останова на segue, чтобы фактически проверить, является ли segue.destination CheckpointVC? Решение было прямо на ваших глазах все время. Так как вы настроили контроллеры вида как таковые ...

ViewController -> TabBarController -> NavigationController which contains a TableViewController

Ваше segue.destination технически является TabBarController, если переход с идентификатором startUp не приведет к TableViewVC.

Короткий способ решить эту проблему - развернуть TableVC из вашего TabBarVC следующим образом:

(tabBarVC.viewControllers[indexOfYourNavVC] as? NavigationController).viewControllers.first as? TableVC)

Более длинный, но более чистый способ сделать это - реализовать шаблон маршрутизации из этого блога. Сожалею, что сам все еще изучаю эту тему, поэтому могу рекомендовать только веб-сайты для начала: https://clean -swift.com / маршрутизации в-очистки Свифт /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...