gpt4 book ai didi

ios - 如何正确地将数据从一个选项卡转移到另一个选项卡

转载 作者:技术小花猫 更新时间:2023-10-29 10:38:54 25 4
gpt4 key购买 nike

Storyboard Image

我有一个标签栏 Controller ,它是初始 View Controller ,它还有一个 PFLoginViewController,如果用户未登录,它会弹出。登录/注册流程工作正常。

这两个选项卡是1. UICollectionView 从现在开始我将称之为 IntroVC2. UITableView,我将其称为 FeedVC

当用户点击 IntroVC 中的照片时,将触发 Show segue(通过 prepareForSegue),显示第三个屏幕(UIView)这在技术上不是一个标签。从现在开始,我将把它称为 SelectVC

注意:所有这些屏幕也嵌入(ded)在导航 Controller 中。

SelectVC 显示一张照片,并且有一个 UIButton 用户可以按下它触发 Show segue 和 Unwind segue,将图像推送到 FeedVC。我创建 Unwind segue 的原因是因为如果没有它,图像将插入 FeedVC(第二个选项卡),但第一个选项卡仍会突出显示。

我用 Unwind segue 解决了这个问题,但我注意到我遇到了一个问题,在选择之后,当我按下第一个选项卡(Intro VC)时,导航栏有一个后退按钮,而且我使用的次数越多SelectVC 按钮推送图像,我必须在 IntroVC 中按 Back 的次数越多。我很困惑如何解决这个问题。很明显,我没有正确连接流程,并且 IntroVC 似乎生成了多次?

当我在 Simulator 中进行 segues 时,我在控制台中收到以下消息:

Nested pop animation can result in corrupted navigation bar

Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

任何帮助将不胜感激!

相关代码如下。

介绍VC.swift

@IBAction func unwindToIntroView(segue: UIStoryboardSegue) {
self.tabBarController!.selectedIndex = 1


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showFeedItem" {
let selectScreenVC = segue.destinationViewController as! SelectScreenViewController
let cell = sender as! UICollectionViewCell
if let indexPath = self.collectionView!.indexPathForCell(cell) {
self.navigationController?.popViewControllerAnimated(true)
selectScreenVC.currentVenue = venueItems[indexPath.row]
}
}

选择VC.swift

@IBAction func pushSelection(sender: UIButton) {
var feedItem = FeedItem()
if let currentItem = currentItem {
feedItem.nName = currentItem.nName
feedItem.imageFile = currentItem.lgImg
feedItem.userName = PFUser.currentUser()!.username!
feedItem.saveInBackgroundWithBlock({ (success: Bool, error: NSError?) -> Void in
self.performSegueWithIdentifier("unwindToVenueView", sender: self)
})
}
}

我知道这是一个奇怪的结构,如果我遗漏了完全理解所需的信息 - 请告诉我,我会相应地进行编辑。

最佳答案

使用数据转到另一个标签

此解决方案使用 unwind segue 切换到新选项卡并向其发送数据。

enter image description here

  • 绿色是标签 1
  • Blue 是 Tab 1 的后代
  • 黄色是标签 2

目标:从蓝色到黄色,同时传递数据。

代码

蓝色 View Controller (选项卡 1 的后代)

import UIKit
class BlueViewController: UIViewController {

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

// this is the data that we want to send
let myData = "Hello from Blue"

// Get a reference to the destination View Controller
// and set the data there.
if let yellowVC = segue.destination as? YellowViewController {
yellowVC.data = myData
}
}
}

黄色 View Controller (选项卡 2)

import UIKit
class YellowViewController: UIViewController {

var data: String?

@IBOutlet weak var dataLabel: UILabel!

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

@IBAction func comingFromBlueUnwindSegue(segue: UIStoryboardSegue) {
// This may get called before the UI views have been loaded if
// the user has not navigated to this tab before. So we need to make
// sure that the label has been initialized. If it hasn't then we
// will have our chance to call updateUI() in viewDidLoad().
// We have to call it here too, though, becuase if the user has
// previously navigated to this tab, then viewDidLoad() won't get
// called again.
if dataLabel != nil {
updateUI()
}
}

func updateUI() {
// only update the label if the string data was previously set
guard let myString = data else {return}
dataLabel.text = myString
}
}

界面生成器

控制从按钮拖动到源 View Controller 顶部的退出图标。由于我们已经将 unwind segue 代码添加到目标 View Controller,因此它将显示为一个选项。选择它。

enter image description here

注意事项

  • 感谢this answer让我走上正轨。
  • 您还可以通过控制从退出图标拖动到 View Controller 图标来设置展开转场。然后您可以以编程方式调用 segue。参见 this answer了解详情。
  • Tab 1 View Controller 没有要显示的特殊代码。

关于ios - 如何正确地将数据从一个选项卡转移到另一个选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29855535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com