在导航控制器不工作的情况下快速展开 segue Xcode 10

Posted

技术标签:

【中文标题】在导航控制器不工作的情况下快速展开 segue Xcode 10【英文标题】:unwind segue Xcode 10 swift with navigation controller not working 【发布时间】:2019-01-04 18:07:26 【问题描述】:

我已经在互联网上寻求答案并按照苹果文档中的步骤进行操作,但无济于事。 我有两个视图控制器。一个包含收藏项目列表 (FavouriteTableViewController),另一个包含添加到收藏列表中的项目的详细信息 (ExplorationDetailViewController)。

我在 ExplorationDetailViewController 的导航栏(来自导航控制器场景)上有一个保存按钮,我想单击它来启动展开转场。我已经执行了以下步骤,但是当我单击保存按钮时,它完全没有响应。我正在包括最相关的展开代码。

我在 ExplorationResultViewController 中创建了 prepareforsegue 函数,我将在其中将图像和标签的数据传递给另一个 ViewController,作为 unwind segue 的一部分

class ExplorationResultViewController: UIViewController 
    var exploration_result: Favourites?
    @IBOutlet weak var ExplorationLabel: UILabel!
    @IBOutlet weak var ExplorationPhoto: UIImageView!

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

        // Pass the selected object to the new view controller.
        super.prepare(for: segue, sender: sender)


        let photo = ExplorationPhoto.image
        let name = ExplorationLabel.text ?? ""

        exploration_result = Favourites(name: name, photo: photo)
    

然后在 FavouriteTableViewController 中,我添加了一个 unwindtoHere 方法,该方法将图像和标签添加到列表中。

class FavouritesTableViewController: UITableViewController 

    // MARK: Properties
    var favourites = [Favourites]()

    // MARK: Actions
    @IBAction func unwindToFavouriteList(sender: UIStoryboardSegue) 
        if let sourceViewController = sender.source as? ExplorationResultViewController, let favourite = sourceViewController.exploration_result
            // Add a new meal.
            let newIndexPath = IndexPath(row: favourites.count, section: 0)
            favourites.append(favourite)
            tableView.insertRows(at: [newIndexPath], with: .automatic)

        

然后进入我的故事板,控制并拖动 ExplorationDetailViewController 中的 Save 按钮并将其连接到场景顶部的退出项。我的展开方法在弹出窗口中显示为:'unwindToFavouriteListWithSender'。我选择这个。

我现在应该可以了,但是当我运行模拟器并单击“保存”按钮时,它完全没有响应。见StoryBoard Design 请帮忙

【问题讨论】:

使用 (_ sender:) 并没有让它变得更好。关于第二个实验,我是否正确地说展开工作所需的最低限度是 @IBAction func unwindToFavouriteList(sender: UIStoryboardSegue) 并将保存按钮连接到退出项目并从弹出窗口中选择 unwindToFavouriteListWithSender。我已经删除了函数体,当我点击保存按钮时仍然没有响应。 如果我给你发一个工作示例会有帮助吗? “完全没有响应” 我想知道问题是否出在按钮上。你能让这个按钮做任何事情吗?点击时会变暗吗?你能把它与不同的动作挂钩吗?也许你把它错误地放入了导航栏或其他东西。相反,您可以在主视图中设置一个按钮来触发展开吗? 按钮是响应式的。当我终止 unwind segue 并向按钮添加 IBAction 以更改同一视图上的标签文本时,当我按下按钮时,它会成功执行此操作。但是,即使使用主视图上的按钮而不是导航栏上的按钮,Unwind segue 也不起作用。所以在我看来,unwind segue 功能不起作用。我正在使用的 Xcode 10beta6 可能是错误吗?没有将按钮正确添加到导航栏是什么意思。导航栏是否会增加任何额外的复杂性。 请注意,我已经在另一个视图(不是 FavouriteTableViewController)和 ExplorationDetailViewController 之间嵌入了导航控制器,我正在模态地进行搜索。 【参考方案1】:

从您的 cmets 来看,我猜问题是在按下 Save 按钮时视图控制器层次结构中没有 FavouritesTableViewController。您不能展开到不存在已经的事物:“展开”意味着返回之前实例化的事物 em> 并保持存在,位于视图控制器层次结构中的当前视图控制器之上。

例如,假设我们有

UINavigationController -> (root view controller) -> FavouritesTableViewController
    -> (push) ExplorationResultViewController

现在我们可以从探索控制器展开到收藏夹控制器,因为收藏夹控制器已经在探索控制器之前的层次结构中。听起来你可能欣赏这个事实。

【讨论】:

可能就是这样。对此很陌生,所以不太欣赏视图控制器层次结构。当我点击 ExplorationResultViewController 中的按钮展开时,FavouritesTableViewController 不在 ViewController 层次结构中。我的故事板设置方式,用户无需在点击 ExplorationResultViewController 上的保存按钮之前打开 FavouriteTableViewController。但我仍然想将 ExplorationResultView 中的信息添加到 FavouriteTableView 并转换到 FavouriteTableView 而无需将 FavouriteTableView 预加载到层次结构中。我该怎么做? 我在故事板设计的原始问题中附加了一张图片。应用程序的流程是它打开到 View1。仅当单击视图 1 中导航栏中的收藏夹按钮时,才会加载视图 4(FavouriteTableViewController)。用户不必这样做。自然流是,在 View1 中打灰色,它进入 view2。在 view2 中点击灰色按钮,它会继续查看 3(ExplorationDetailViewController),其中嵌入了导航控制器。当用户点击 View 3 中的保存按钮时,我希望它转换到 view4 并将 view3 中的信息添加到 view4 的表格列表中。 “当用户在视图 3 中点击保存按钮时,我希望它转换到视图 4” 但是您说“用户不必这样做”。如果用户尚未加载视图 4,则您不能“​​展开”到视图 4。我现在只是重复我已经说过的话。我想我已经回答了这个问题。做什么而不是放松的问题当然是一个不同的问题。 是的。谢谢马特。我意识到它不是一个展开功能,而是更多地将数据推送到另一个视图。我刚刚在屏幕上实现了一个 push segue 并使用 prepareforsegue 来移动数据。这很好用。感谢您解决此问题。 非常有帮助的答案。很容易检查self.navigationController?.viewControllers 以查看目标是否在堆栈中。在我的例子中,故事板在 segue 设置中加载了一个自定义类,用目标控制器替换了源控制器。

以上是关于在导航控制器不工作的情况下快速展开 segue Xcode 10的主要内容,如果未能解决你的问题,请参考以下文章

Segue 动画无法完全正常工作

展开 Segue 导致清晰的导航栏

在不显示标签栏的情况下执行对另一个导航控制器的 segue

展开后执行segue

Unwind Segue 在 iOS 8 中不起作用

使用 Swift 在没有情节提要的情况下展开 segue