【问题标题】:Sending data through Unwind Segues通过 Unwind Segues 发送数据
【发布时间】:2016-06-20 09:43:27
【问题描述】:

我有一个自定义展开转场问题。让我解释一下我的控制器设置:

我有一个主屏幕,它是一个导航控制器,里面有一个单元格视图。在此视图中,有一个添加数据的按钮,在该视图中有 4 个按钮用于添加其他“类型”的数据。一旦用户选择了这四个选项之一,他们就会看到一个特定于他们选择的视图控制器,允许他们使用完成按钮输入数据。从现在开始,我将这三个屏幕分别称为 Main View、Options View 和 Data View(所有 4 个选项都遵循此约定)。

经过一些教程后,我在主视图的控制器类中做了一个自定义展开转场,如下所示:

@IBAction func unwindToTables(segue: UIStoryboardSegue) {
    //function proto for adding data here
    //populateTableWithData(data :ItemData)
}

在故事板编辑器中,无论何时我从任何视图控制器control + click 到它的出口,它都会正确列出我的展开segue,这工作正常。

我现在想通过展开发送数据。在 Data View 中,我有一个 Done 按钮,用于构造和初始化一个名为 ItemData 的数据类,我想通过 segue 传递到该类。

我在 SO 或其他网站上发现的大多数问题都涉及正常的 segues,当我尝试实现它们时,应用程序会导致运行时错误/无法编译。

以前有没有人遇到过这个问题,并且有解决该问题的方法?任何帮助或正确方向的观点将不胜感激!

编辑:

我将我的展开函数编辑如下:

@IBAction func unwindToTables(segue: UIStoryboardSegue) {
    let dataC = segue.sourceViewController as? DataVC
    let data : ItemData = dataC!.SubmittedData! //unwrapping error

    print(data.Name)


    //save data

}

在每个 New{1-4}ViewController 之上,我有以下内容:

import UIKit

class New1ViewController: DataVC,

我创建了一个新的超类 DataVC:

import Foundation

class DataVC: UITableViewController {
    var SubmittedData: ItemData?
}

但现在我遇到了一个解包问题...我必须先初始化 SubmittedData 吗?

编辑 2:

我想我可以添加我正在做的“完成”按钮...

@IBAction func DonePressed(sender: AnyObject) {

    let n = ...
    ...
    let d = ...

    super.SubmittedData = ItemData(FieldType: "1", CName: n!, CPhone: p!, CAddress: a!, ShouldBe: s!, Repeats: r!, Starts: b, RemindMe: m!, AdditionalNotes: d!)

}

【问题讨论】:

    标签: ios uiviewcontroller segue unwind-segue


    【解决方案1】:

    传递给您的unwindToTables: 函数的UIStoryboardSegue 有一个属性sourceViewControllee,这将是您的Data 视图控制器的实例。

    您需要所有视图控制器都继承自一个通用超类,以便您可以添加所需的属性:

    class DataVC: UITableViewController {
        var submittedData: ItemData?
    }
    

    然后你会得到类似的东西:

    class New1ViewController: DataVC,... {
    ...
    }
    

    然后在您的 unwind 方法中,您可以检索 submittedData 属性

    @IBAction func unwindToTables(segue: UIStoryboardSegue) {
        if let dataVC = segue.sourceViewController as? DataVC {
          if let info = dataVC.submittedData {
             ...
          }
        }
     }
    

    【讨论】:

    • 所以在你的假设中,我实际上为每个视图控制器都有单独的类。我在 Data View 类中继续前进,并在我按下 Done 按钮时填充的任何方法(几乎是全局变量)之外执行了 var dataValues : ItemData。现在,当我转到主视图的控制器类并放置您放置的内容(当然是修改的)时,我无法访问该 var,因为它是内部的,并且键入 public 会导致初始化程序出错(???)。
    • 如果您添加一个属性,您需要对其进行初始化或将其声明为可选。我建议使用可选方法,这意味着在您访问它时将其打开
    • 我刚刚意识到我可能会遇到我正在检查四个不同的视图控制器的问题...查看我的编辑以查看您是否可以确认...
    • 是的,这就是为什么我说你需要所有的视图控制器都继承自一个通用的超类。这个超类会添加你的itemData。让我更新我的答案以表明我的意思
    • 你应该可以说self.submittedData,而不是super.。你是如何触发你的 unwind segue 的?设置submittedData 后,您需要调用performSegueWithIdentifier。如果您直接从 Interface Builder 中的 done 按钮触发它,则不会设置该属性。我的代码不应该给出异常,因为我有条件地展开。你从哪里得到异常?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2017-03-08
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多