2014-03-04 65 views
0

我的问题更多的是基于设计的问题,但我想学习新的东西,所以请不要关闭它。这可能有点大,但我想让它更容易理解我在找什么:在控制器的初始化方法中传递属性

我有4个控制器,即ctrlA,ctrlB,ctrlC和ctrlD,它被一个接一个地调用,即ctrlA调用ctrlB, ctrlB调用ctrlC等... ctrlA -> ctrlB -> ctrlC -> ctrlD

我在ctrlA中有一个属性,它的值在ctrlC和ctrlD中设置时是必需的。我认为这样做的一种方式是通过每个控制器的init方法传递它,只有当我们拥有有限的属性时,我才了解它是好的。 (我现在只有1个房产)。

代码会是这样的:

类CTRLA:

@implementation ctrlA 
{ 
    - (void)someMethod 
    { 
     BOOL isEmpty; 
     if (somethingIs == true) 
     { 
      isEmpty = YES; 
      ctrlB *controller = [[ctrlB alloc] initWithIsEmpty:isEmpty]; 
     } 
    } 
} 

类CTRLB:

@implementation ctrlB 
{ 
    - (void) initWithIsEmpty:(BOOL)isEmpty 
     { 
     self.isEmpty = isEmpty; 
     } 

    - (void) someMethodB 
     { 
     ctrlC *controller = [[ctrlC alloc] initWithIsEmpty:self.isEmpty]; 
     } 
} 

类CTRLC:

@implementation ctrlC 
{ 
    - (void) initWithIsEmpty:(BOOL)isEmpty 
     { 
     self.isEmpty = isEmpty; 
     } 

    - (void) useIsEmpty 
     { 
     // Use self.isEmpty value in here to set text on a cell and also pass it to ctrlD in below method. 
     } 

    - (void) someMethodC 
     { 
     ctrlD *controller = [[ctrlD alloc] initWithIsEmpty:self.isEmpty]; 
     } 
} 

类CTRLD:

@implementation ctrlD 
{ 
    - (void) initWithIsEmpty:(BOOL)isEmpty 
     { 
     self.isEmpty = isEmpty; 
     } 

    - (void) useIsEmpty 
     { 
     // Use self.isEmpty value in here to set text on a cell. 
     } 
} 

问题 - 它是好打发财产我上面描述的方式?我想尝试的另一种方法是使用协议,但不确定这是否是最好的方法。原因是,我试图通过的属性'isEmpty'是一个本地属性,并且只在ctrlA的一个方法中设置,即在ctrlA的'someMethod'中。有没有其他更好的方法将属性传递给其他控制器?

回答

0

尽管通过初始值设定项传递值肯定是可以的,但更直接的方法是将共享值保存在模型对象中。控制器ctrlA将设置模型中的值,然后控制器ctrlCctrlD将能够在他们方便的时候抓住它。

这是an answer illustrating this concept。这是一个描述how to access a model class from multiple view controllers的问题。

+0

是的,我知道模型对象。但在这种情况下,我没有模型对象。该属性属于ctrlA,不是模型属性。 –

+0

@tech_learning如果你没有模型,那么你做的是正确的事情。 – Merlevede

+0

@tech_learning您可以自己决定是否构建模型属性。为了成为模型的一部分,一段数据不需要持久化 - 模型对象可以包含瞬态数据,也可以包含元数据或描述可视属性的数据,而不是数据项本身。将共享数据放在模型中的一个优点是这种方法非常普遍 - 阅读代码的其他人将花更少的时间来理解它。 – dasblinkenlight