2015-10-23 109 views
2

对于创建的任何对象,我通常使用两个两个作用域1)Singleton 2){local scope}。我正在寻找之间的东西。在VIewControllers之间共享数据 - iOS

说我有一个对象,5视图控制器正在编辑。我想在视图控制器之间共享一个对象,而不必在视图控制器之间传递它。但它不应该也贯穿整个应用程序,因为一旦我完成编辑对象,我不再需要它了。

我不想从另一个类继承所有的视图控制器在那里创建一个变量。由于视图控制器可以重用于不同的对象。我想创建一个在启动第一个视图控制器之前生动的对象,它遍布5个视图控制器的范围,然后在我保存它之后死亡。无论如何,我可以在iOS中做到这一点。

+2

为什么你不想在视图控制器之间传递对象?这是正确的解决方案。 – rmaddy

+0

因为它使视图控制器紧密耦合,难以理解流程。它像保持局部变量在第一个VC,然后传递它。如果第一个VC编辑的东西需要第四个,那么我无缘无故地通过4VC。 – ila

+0

如果在控制器之间传递数据使您的代码紧密耦合,那么您做得不正确,或者您需要阐明您的需求以及您正在做的事情。 – rmaddy

回答

0

正如马特所说,你可以做的就是在那个什么。对我来说更好的是为那些能完成特定工作的人创建特定的课程。

class EditingSession { 
    class Factory { 
     private static let session = EditingSession() //do it lazy 
     static func create() -> EditingSession { 
      return session 
     } 
    } 

    func openSession() { 

    } 

    func endSession { 

    } 

    func getData() -> AnyObject { 
     ... 
    } 
} 
  1. 在编辑会话创建专用的初始化。工厂应该给共享实例。

  2. 您可以将此类传递给您的ViewControllers并使用数据进行操作。您可以注入它,或者只需将其设置为VC或VM中的属性。

  3. 如果您已完成编辑,您应该结束会话并清除数据或其他内容。

2

另一种方法是使用你的AppDelegate。在它内部,你可以声明一个全局变量而不是2个函数,第一个是获取当前值,另一个是设置值。

它可能给这样的:

// Get AppDelegate instance 
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate; 

// Use your getter to get the current value 
var something = appDelegate.getYourStuff(); 

// Or use a setter to set it, a modifier to modify oit 
appDelegate.setYourStuff(yourStuff); 
appDelegate.modifiyYourStuffAttribute(newAttributeValue); 

没有意识到,如果这种方法是一种不好的做法或没有,但它为我工作。

打开其他建议!

+0

同意Mat。你可以在AppDelegate中定义你的对象,在你的第一个视图控制器中初始化,当你在第五个视图控制器中完成编辑时,将它终止。 – truongky