2014-02-19 5 views
0

У меня есть первый UISplitViewController, в котором есть (и по умолчанию) два других контроллера представления в виде дочерних элементов, и для одного из них есть еще один контроллер представления в качестве дочернего (опять же он по умолчанию).Как поделиться моделью с несколькими контроллерами?

Моя проблема заключается в том, что модель, которая в основном является классом, используемая бизнес-логикой, создается в AppDelegate, и я бы хотел использовать ее в каждом контроллере.

Я попытался использовать метод viewDidLoad для передачи модели через весь контроллер, но этот метод вызывается в последнем дочернем элементе, а затем проходит через иерархическое дерево в SplitViewController.

Два ограничения я хотел бы FULLFILL являются:

  • Я не хочу использовать синглтон
  • Я не хочу, чтобы все мои контроллеры знать AppDelegate

Есть ли способ этого?

+0

Что является причиной «Я не хочу использовать синглтон» –

+0

меня попросили ограничить dependecies на самых низких. – Cratein

+0

Я согласен с @GrzegorzKrukowski, синглтоны на самом деле обеспечивают упрощенный способ запуска класса. вы просто вызываете метод вместо того, чтобы делать alloc/init каждый раз. – user2277872

ответ

0

Если вы не хотите использовать singleton по какой-либо причине, вы можете просто пройти модель через эти ViewControllers. Просто создайте собственный метод initWithModel: для каждого из ViewControllers, который у вас есть при их создании, и иерархически передайте данные им. Может быть, создать базовый класс для всех, чтобы он был общим.

Для раскадровки вы можете назначить модель в методе prepareForSeque сразу после создания ViewControllers.

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([[segue identifier] isEqualToString:@"myViewController"]) 
    { 
     [segue.destinationViewController setModel:self.model]; 
    } 
} 
+0

Поскольку я использовал раскадровку, я сам не вызываю init, и я не знаю, какой метод init вызывается раскадрой. Но если я могу переопределить метод initWithModel, зная, что это будет тот, который вызван раскадрой, это прекрасно. – Cratein

+0

@Cratein Это все больше похоже на одноэлементное решение все время ... – trojanfoe

+0

Вы можете передать свою модель внутри метода prepareForSeque –

0

Это может быть ответом:

в .h:

+(MyModel *)shared; 

в .m:

static MyModel *myModel; 

@implementation MyModel 

+(MyModel *) shared{ 
    if (nil != myModel) { 
     return myModel; 
    } 

    static dispatch_once_t pred; 
    dispatch_once(&pred, ^{ 
     myModel = [[MyModel alloc] init]; 
    }); 
    return myModel; 
} 

Таким образом, вы можете получить доступ к вашей модели в любом месте вашего приложения.

Надеюсь, что это поможет!

EDIT: добавить в dispatch_once

+0

'dispatch_once()' является предпочтительным методом создания singleton. – trojanfoe

+0

Это может быть ответ, но я хотел бы попробовать другое решение, прежде чем приходить в одноэлементное решение – Cratein

Смежные вопросы