展开 segue 不触发

Posted

技术标签:

【中文标题】展开 segue 不触发【英文标题】:unwind segue not triggering 【发布时间】:2016-10-25 14:45:08 【问题描述】:

我一直在学习 swift,并为我的大部分应用奠定了基础。我有以下情节提要

app storyboard

一切正常。例如,我在添加课程视图控制器上有一个展开转场,当您按下保存并返回到“您的课程”视图控制器时触发。

当您在我的课程视图控制器上时,您可以选择一门课程并显示主题,然后您可以选择一个主题并进入更新分数视图控制器,这一切都很好。

但是,我的问题是这样的。我想这样做,以便当您在更新分数视图控制器中选择保存时,会触发展开转场(与添加课程中相同),并且您将返回到主题视图控制器中的主题列表。

但是,我已经学习了许多教程,并且显然之前可以使用它。 (我的展开转场的操作方法在正确的主题视图控制器中)但是当我按下保存时,展开转场并没有将我返回到主题视图控制器。

有人可以提出原因吗?我花了很多时间试图找到答案并浏览了许多教程但没有设法解决它。

我还为我的保存按钮添加了触发 segue 的连接的屏幕截图,以显示它已设置。 Showing triggered segue for save button

我在更新分数视图控制器中有以下代码

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if saveButton === sender 
        print("save button selected")
   

但是当我点击保存时,即使这也没有被触发。

非常感谢

更新: 遵循 Ronatorys 的建议后,我的更新分数的视图控制器如下,但它仍然无法正常工作:

导入 UIKit

类 UpdateScoreTableViewController: UITableViewController

@IBOutlet weak var topicGettingUpdated: UITextField!
@IBOutlet weak var newScore: UITextField!


@IBOutlet weak var saveButton: UIBarButtonItem!


var index:Int?
var Topics:[String]!


var TopicToUpdate:String?


override func viewDidLoad() 
    super.viewDidLoad()


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 prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

    guard let uiBarButtonItem = sender as? UIBarButtonItem else 
        print("There is no UIBarButtonItem sender")
        return
    



override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    if indexPath.section == 0 && indexPath.row == 0 
        newScore.becomeFirstResponder()
    
    tableView.deselectRowAtIndexPath(indexPath, animated: true)

但是准备转场甚至没有被触发。

【问题讨论】:

如果没有更多信息,很难帮助您解决这个问题。 prepareForSegue 没有被触发的事实仅仅证实了 unwind segue 没有工作。 【参考方案1】:

就像 cmets 中的 Craig 所说,要找到问题并不是那么容易。因此,我只是构建了一个简单的应用程序,您可以在其中按照指导步骤进行操作,看看您是否忘记了正确设置功能的内容。希望它会帮助你。 注意:代码在 Swift 3.0 中,但应该易于采用 2.*

1.带有两个视图控制器的情节提要:

2。在FirstViewController.swift中声明unwind segue的动作方法:

class FirstViewController: UIViewController 
  // action method for the unwind segue
  @IBAction func updateScore(_ segue: UIStoryboardSegue) 
    print("Back in the FirstViewController")
   

3.将 Storyboard 中的Save button 与 action 方法(使用 ctrl + 拖动)连接起来:

4.将您的 Save buttonSecondViewController.swift 文件连接,以使用它检查您的 prepareSegue 方法(使用 ctrl + 拖动):

5.将prepare(for:sender:) 方法添加到您的SecondViewController.swift

class SecondViewController: UIViewController 

  @IBOutlet weak var saveButtonPressed: UIBarButtonItem!

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    // check safely with guard that your save button is the sender and you can use it
    // if not print message
    guard let uiBarButtonItem = sender as? UIBarButtonItem else 
      print("There is no UIBarButtonItem sender")
      return
    

    // check if you selected the save button
    if saveButtonPressed == uiBarButtonItem 
      print("save button selected")
    
  

结果:

您可以找到here的示例应用程序

【讨论】:

嗨,Ronatory,非常感谢,但它没有奏效。我尝试按照您的所有步骤操作,但是当我按保存时仍然没有任何反应。甚至没有触发 segue 的准备,并且控制台中没有显示“没有 UIBarButtonItem 发件人”。我想也许我对导航控制器有一些不明白的地方。因此,我删除了嵌入更新分数的导航控制器,一切正常,我理解这一点,即我可以导航回堆栈。正是在这一点上,我无法让那个保存按钮工作。【参考方案2】:

我没有设法让 unwind segue 工作,而是使用了

navigationController!.popViewControllerAnimated(true)

作为一种解决方法,这工作正常。

【讨论】:

以上是关于展开 segue 不触发的主要内容,如果未能解决你的问题,请参考以下文章

未触发自定义 segue 的展开

展开后执行segue

Swift 中 Segue Unwind 的解决方法不触发

从 Unwind segue 触发时,Push segue 不起作用

以编程方式展开 Segue - 新的转折

在 Xamarin.iOS 中使用 UITableViewCell 展开 Segue