【问题标题】:How to pass data between Swift files without prepareForSegue?如何在没有 prepareForSegue 的情况下在 Swift 文件之间传递数据?
【发布时间】:2017-02-01 11:15:08
【问题描述】:
我目前有三个 Swift 文件,一个用于 ViewController 中的主视图,另外两个用于第一个视图中的两个视图,用于分段控件。
由于它们之间不使用segues,我不能使用prepareForSegue方法在它们之间传输数据,那么如何将变量等从一个文件传输到另一个文件?
这似乎不是重复的,因为其他案例(例如评论的案例正在使用 segues),我的不是。
【问题讨论】:
标签:
ios
swift
xcode
navigation
【解决方案1】:
三个 Swift 类都是视图控制器的子类吗?
您的主视图控制器带有分段控件。对于每个分段,我会创建一个新的视图控制器子类。
在您的主视图控制器上,对于每个段,使用“容器视图”而不是 UIView 对象。
这将在情节提要中创建两个新的“屏幕”,通过 segue 连接到您的主视图控制器。这些新屏幕将是 UIViewControllers,您可以像往常一样将它们更改为您的子类。
您现在可以正常使用 prepareForSegue 函数在分段控制视图控制器中设置数据。
【解决方案2】:
所以你有类似viewControllerMain 的东西,其中包含viewSegmentedOne 和viewSegmentedTwo,并且你希望能够访问`viewControllerMain.myProperty'?
您始终可以在层次结构中导航以获取父视图 - 但最简单的选择可能是在每个分段控件中包含对 viewControllerMain 的引用
var myParentVC : ViewControllerMain?
然后当你创建子视图时
mySubView.myParentVC = self
【解决方案3】:
如果您将情节提要用于视图控制器,请尝试如下:
let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Your_VC_Identifier");
viewController.Your_var = Your_value_to_assign
注意:在 ViewController 类中定义 Your_var
【解决方案4】:
您只需要创建一个您想要显示的视图控制器的实例,这很简单,例如调用情节提要实例(通常呈现的视图控制器有一个)instantiateViewController(withIdentifier:),通过使用您提供的标识符故事板文件。
创建一个,您可以通过将其转换为视图控制器类来传递您想要的数据并按照您的喜好呈现。
【解决方案6】:
试试这个:
let defaults = UserDefaults.standard()
defaults.set(yourdata, forKey: "someObject")
print(defaults.object(forKey: "someObject"))
【解决方案7】:
您可以尝试使用 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)
}