我有两个视图,我想将数据从一个视图传递到下一个视图。第一个视图是我想要传递给下一个视图的数据,我们可以将其称为SourceViewController
。但是SourceViewController
嵌入在NavigationViewController
中,而第二个ViewController允许调用它DestinationViewController
是TabViewController
中的第一个视图。
我尝试使用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)
}
}
这就是故事板的样子:
答案 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
}
}
答案 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)