我目前有三个 Swift 文件,一个用于 ViewController 中的主视图,另外两个用于第一个视图中的两个视图,用于分段控件。
由于它们彼此之间不使用 segue,因此我无法使用 prepareForSegue 方法在它们之间传输数据,那么如何将变量等从一个文件传输到另一个文件呢?
这似乎不是重复的,因为其他情况(例如评论的情况)正在使用 segues,而我的不是。
这三个 Swift 类都查看控制器子类吗?
您的主视图控制器带有分段控件。对于每个分段,我将创建一个新的视图控制器子类。
在主视图控制器上,对于每个段,使用"容器视图"而不是 UIView 对象。
这将在情节提要中创建两个新的"屏幕",通过 segue 附加到主视图控制器。这些新屏幕将是UIView控制器,您可以像往常一样将它们更改为子类。
现在,您可以正常使用 prepareForSegue 函数在分段控件视图控制器中设置数据。
所以你有类似 viewControllerMain
的东西,它包含viewSegmentedOne
和viewSegmentedTwo
,并且您希望能够访问"viewControllerMain.myProperty"?
您始终可以在层次结构中导航以获取父视图 - 但最简单的选择可能是在每个分段控件中包含对viewControllerMain
的引用
var myParentVC : ViewControllerMain?
然后在创建子视图时
mySubView.myParentVC = self
如果将情节提要用于视图控制器,请尝试如下操作:
let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Your_VC_Identifier");
viewController.Your_var = Your_value_to_assign
注意:在视图控制器类中定义Your_var
您只需要创建要显示的视图控制器的实例,这很容易,例如使用您在情节提要文件中提供的标识符调用情节提要实例(通常呈现视图控制器有一个)instantiateViewController(withIdentifier:)
。
创建后,您可以通过将所需数据强制转换为视图控制器类并根据需要呈现来传递所需的数据。
一种方法是使用单例类。 https://cocoacasts.com/what-is-a-singleton-and-how-to-create-one-in-swift/这就是制作单例类的方法。
其他方法可能是使用 nsuserdefaults。
您需要根据您的要求决定哪种方法最好。
试试这个:
let defaults = UserDefaults.standard()
defaults.set(yourdata, forKey: "someObject")
print(defaults.object(forKey: "someObject"))
您可以尝试使用 UIViewController 的扩展
private var storedDataKey: UInt8 = 0
extension UIViewController {
var storedViewControllerData: UIViewController? {
get {
return objc_getAssociatedObject(self, &storedDataKey) as? UIViewController
}
set(newValue) {
objc_setAssociatedObject(self, &storedDataKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_ASSIGN)
}
}
}
这非常有用,您可以使用链发送数据,例如:
viewControllerB.storedViewControllerData = viewControllerA.storedViewControllerData
或
func viewDidLoad() {
doSomething(self.storedViewControllerData)
}