在多个Controller上执行segue

时间:2015-04-21 15:55:24

标签: ios swift segue

如何从UITabBarController Child ViewController执行segue到UITavigationController的DetailView,其中包含UINavigationController?

enter image description here

有一个带有两个子节点的TabBarController,FirstView(观看次数最多的符号)和NavigationController(Contacts Symbol)。

FirstView有一个按钮,它应该执行一个segue来显示Profile VC。 NavCont有一个带有子类All ProfilesTVC的TableView,其原型单元格为子节点。 AllProfilesTVC有一个包含三个名称的数组,由重用的单元格显示。

我必须在FirstView(HomeVC)中的函数prepareForSegue中实例化和准备哪个viewcontroller,以及我在storyboard中创建的segue应该指向哪里?所以我在" John""详细视图。 是否有可能当我对ShowProfileVC执行segue时,我可以按后退按钮返回All ProfilesTVC?

对于想要在github repo

尝试的人,有一个github回购

FirstView / HomeVC.swift

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    // what do we do here ???
}

AllItemsTVC

class AllItemsTVC: UITableViewController {

let profiles = ["Joe", "John", "Ken"]

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

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return profiles.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
    let profile = profiles[indexPath.row] as String
    cell.textLabel?.text = profile
    return cell
}

@IBAction func cancelFromShowProfile(segue: UIStoryboardSegue) {
}

// MARK: - Navigation

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if let identifier = segue.identifier {
        switch identifier {
        case "ShowProfile":
            if let showProfileVC = segue.destinationViewController as? ShowProfileVC {
                // pass the data to the destinationVC
                let selectedProfile = profiles[tableView.indexPathForSelectedRow()!.row] as String
                showProfileVC.name = selectedProfile
            }
        default: break
        }
    }
}

ShowProfileVC

class ShowProfileVC: UIViewController {

@IBOutlet weak var textLabel: UILabel! {
    didSet {
        textLabel.text = name
    }
}

var name = "Label"

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

}

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你不能用segue做到这一点,但这不是问题,因为你可以在代码中完成它。只需在故事板中为视图控制器提供identifier,并使用相应的UIStoryboard API通过此标识符对其进行实例化。

首先切换到代码中的另一个标签栏项目,然后首先告诉导航控制器popToRootViewController,之后您可以依次将所有必要的控制器推送到导航堆栈。您可以在推送控制器之前执行通常在prepareForSegue中执行的所有配置。

诀窍是在animated设置为false的情况下完成所有操作,但最后一步除外。