在视图控制器之间传递数据使用从导航控制器中嵌入的视图到tabbarcontroller的segue

时间:2018-04-05 06:19:07

标签: swift storyboard segue uistoryboardsegue

我有两个视图,我想将数据从一个视图传递到下一个视图。第一个视图是我想要传递给下一个视图的数据,我们可以将其称为SourceViewController。但是SourceViewController嵌入在NavigationViewController中,而第二个ViewController允许调用它DestinationViewControllerTabViewController中的第一个视图。

我尝试使用this question的答案,但它无法超越导航视图,只是跳过整个逻辑。

这是我的代码:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "loginSuccessSugue") {

        if let tab = self.presentingViewController as? UITabBarController,
            let nav = tab.viewControllers?[0] as? UINavigationController,
            let destinationVC = nav.viewControllers.first as? HomeViewController {


             destinationVC.currentBalance = serviceBalance
        }

    }
}

这是HomeViewController

class HomeViewController: UIViewController , UITableViewDelegate,UITableViewDataSource, UICircularProgressRingDelegate{

var currentBalance = 0.0

 override func viewDidLoad() {
    super.viewDidLoad()

    circularBalance.maxValue = CGFloat(currentBalance)
     print(currentBalance)

   }

  override func viewDidAppear(_ animated: Bool) {
    print(currentBalance)
    circularBalance.setProgress(value: CGFloat(currentBalance), animationDuration: 3)

     }
}

这就是故事板的样子:

enter image description here

3 个答案:

答案 0 :(得分:4)

这是我的视图控制器,您可以在其中检查我是否向tabbar发送了第一个viewcontroller:

<?php if($category_slug=='abc-bed'){?>  
        <div id="catHero">
            <div id="blackPostBox"  class="<?php echo "cat_id_" . $category_slug?>"> 
                <h1 id="cath1"><?php echo $root[0]->post_title ?></h1>
                <hr class="color-strip">    
                <p><?php echo $text = apply_filters('the_excerpt', get_post_field('post_excerpt', $root[0]->post_content ));?></p>
                <div class="searchbar"><?php get_search_form(); ?></div>
            </div>
        </div>

    <?php elseif ($category_slug=='abc_efg') {?>
        # code...
    <?} ?>
    <?php else ($category_slug=='abc_rrg') {?>
        # code...
    <?} ?>
    <?php }?>

现在您可以查看我的第一个视图控制器,您可以在哪里检查我们获得的值。

   class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.performSegue(withIdentifier: "segueIdentifier", sender: self)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let barViewControllers = segue.destination as! UITabBarController
        let destinationNv = barViewControllers.viewControllers?[0] as! UINavigationController
        let destinationViewController = destinationNv.viewControllers[0] as! FirstViewController
        destinationViewController.currentBalance = 5
    }
}

现在,您可以查看我的控制台和故事板: enter image description here

enter image description here

答案 1 :(得分:3)

来自Apple的UIViewController文档:

  

var presentsViewController:UIViewController?

     

提供此视图控制器的视图控制器。

哪个对您有用,** IF **您试图回到导航层次结构中,就像SO post you referenced中的人一样。

您正在尝试将git rev-list VC已提供的SOURCEVIEWCONTROLLER 强制转换为SourceViewController,这可能会失败,这就是为什么您从未在嵌套{UITabBarController内找到断点的原因{1}}&#39; S

如果我们在docs中查看下一个变量,我们可以看到一些内容将我们带到我们提出的if let

  

var presentsViewController:UIViewController?

     

此视图控制器提供的视图控制器,或者一个   其视图控制器层次结构中的祖先。

现在回顾一下解决困境所需的代码。我会给你你发布的相同代码,但在评论中修正我的动词时态:

UIViewController

当英语欺骗你时,难道不是很沮丧吗?

编辑:

由于您要传递 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if (segue.identifier == "loginSuccessSugue") { //ing -> ed if let tab = self.presentingViewController as? UITabBarController, let nav = tab.viewControllers?[0] as? UINavigationController, let destinationVC = nav.viewControllers.first as? HomeViewController { destinationVC.currentBalance = serviceBalance } } 中的数据,因此您实际上希望从prepareForSegue:获取UITabBarController。由于segue.destination UITabBarController属性在准备segue时将为零或空。这是传递数据的糟糕方法。

您可能需要创建ViewControllers的自定义子类,将变量传递给它,然后将该数据传递到UITabBarController中的viewControllers

viewDidLoad

更新了class MyTabBarController: UITabBarController { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } var serviceBalance : Double? override func viewDidLoad() { super.viewDidLoad() //Make sure vc is not null or empty before continuing. guard let vcs = viewControllers, !vcs.isEmpty else { return } if let navVC = vcs[0] as? UINavigationController, let destinationVC = navVC.viewControllers[0] as? UIViewController { destinationVC.serviceBalance = destinationVC } } }

prepareForSegue:

请勿忘记将故事板的身份检查器中的override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let tabBarVC = segue.destination as? MyTabBarController { tabBarVC.serviceBalance = serviceBalance } } 类更改为UITabBarController

答案 2 :(得分:2)

您需要更改if()条件代码。

使用以下代码会将您的HomeViewController放入segue目的地。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "loginSuccessSugue") {
            if let destinationVC = segue.destination as? HomeViewController {
                destinationVC.currentBalance = serviceBalance
            }
        }
    }

segue.destination一样,您将获得HomeViewController,因此无需从标签+导航堆栈中获取。

希望这会有所帮助!

编辑:

let destinationVC = segue.destination as? HomeViewController
Print(destinationVC)