如何在没有prepareForSegue的情况下在Swift文件之间传递数据?

时间:2017-02-01 11:15:08

标签: ios swift xcode navigation

我目前有三个Swift文件,一个用于ViewController中的主视图,另外两个用于第一个视图中的两个视图,用于分段控件。

由于这些不使用segu,我不能使用prepareForSegue方法在它们之间传输数据,那么如何将变量等从一个文件传输到另一个文件呢?

这似乎并不重复,因为其他案例(如评论的人使用segues,我的不是。)

7 个答案:

答案 0 :(得分:2)

是否所有三个Swift类都查看控制器子类?

您的主视图控制器具有分段控件。对于每个分段,我将创建一个新的视图控制器子类。

在主视图控制器上,对于每个细分,请使用“容器视图”'而不是UIView对象。

这将创建两个新的屏幕'在故事板中,使用segue连接到主视图控制器。这些新屏幕将是UIViewControllers,您可以将它们更改为您的子类正常。

您现在可以正常使用prepareForSegue函数在分段控件视图控制器中设置数据。

答案 1 :(得分:1)

所以你有类似viewControllerMain的东西,其中包含viewSegmentedOneviewSegmentedTwo,你希望能够访问`viewControllerMain.myProperty'吗?

您始终可以在层次结构中导航以获取父视图 - 但最简单的选项可能是在每个分段控件中包含对viewControllerMain的引用

var myParentVC : ViewControllerMain?

然后在您创建子视图时

mySubView.myParentVC = self

答案 2 :(得分:0)

如果您正在为视图控制器使用故事板,请尝试这样:

let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Your_VC_Identifier");
viewController.Your_var = Your_value_to_assign

注意:在ViewController类中定义Your_var

答案 3 :(得分:0)

你只需要创建一个你想要显示的视图控制器的实例,这很容易,比如调用storyboard实例(通常是呈现视图控制器有一个)instantiateViewController(withIdentifier:),通过使用你的标识符提供故事板文件。
创建一个,您可以将所需数据传递给视图控制器类,并根据需要显示它。

答案 4 :(得分:0)

一种方法是使用单例类。 https://cocoacasts.com/what-is-a-singleton-and-how-to-create-one-in-swift/这就是你如何制作单身人士课程。

其他方法可能是使用nsuserdefaults。

您需要根据您的要求确定哪种方法最佳。

答案 5 :(得分:0)

试试这个:

let defaults = UserDefaults.standard()
defaults.set(yourdata, forKey: "someObject")
print(defaults.object(forKey: "someObject"))

答案 6 :(得分:0)

您可以尝试使用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)
}