Objective-C: MVC с одной моделью и различными контроллерами представления - PullRequest
0 голосов
/ 26 января 2011

У меня есть RootViewController (приложение для навигации), которое просит модель (brain.h/m) выполнить и получить некоторую информацию.Очевидно, я сначала создал экземпляр переменной модели.

Это интерфейс RootViewController.h:

#import <UIKit/UIKit.h>
#import "Brain.h"


@interface RootViewController : UITableViewController 
{
 Brain *cerebro;
}

@property (nonatomic, retain) Brain *cerebro;

@end

Я добавил вторую viewcontroller для управления отображением подробного представления.когда пользователь нажимает на строку в tableview первого viewcontroller:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

 /*
  <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
  [self.navigationController pushViewController:detailViewController animated:YES];
  [detailViewController release];
  */

Как я могу сослаться на модель и спросить у модели, что первый viewcontroller был создан без ее повторного созданияво втором viewcontroller?

Ответы [ 3 ]

1 голос
/ 26 января 2011

Вы можете воспользоваться страницей из правил подключения возможностей программирования и заставить корневой контроллер вводить или наделить Brain подчиненному контроллеру.

Введение:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  <#DetailViewController#> *detailViewController 
      = [[<#DetailViewController#> alloc] 
              initWithNibName:@"<#Nib name#>" 
                       bundle:nil];
  // introduce the Brain
  detailViewController.brain = ref.to.rootController.brain;
  // ...
  // Pass the selected object to the new view controller.
  [self.navigationController pushViewController:detailViewController animated:YES];
  [detailViewController release];

Фонд:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  <#DetailViewController#> *detailViewController 
      = [[<#DetailViewController#> alloc] 
              initWithNibName:@"<#Nib name#>" 
                       bundle:nil 
                        brain:ref.to.rootController.brain];
  // ...
  // Pass the selected object to the new view controller.
  [self.navigationController pushViewController:detailViewController animated:YES];
  [detailViewController release];
0 голосов
/ 27 января 2011

Вы можете попробовать добавить эту ссылку непосредственно в AppDelegate, чтобы сделать ее похожей на fake global var.

т.е.:

в интерфейсе AppDelegate:

Brain *cerebro;

@property (nonatomic, retain) Brain *cerebro;

И в любом месте кода:

[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] cerebro]

должно работать хорошо ...


Если вы используете много раз, и только один Brain подумает о реализации singleton

Если вы используете много Brain, это может быть хорошей идеей для реализациисинглтон BrainManager, который вы можете использовать следующим образом:

Brain *cerebro = [[Brain alloc] init...]
[[BrainManager sharedManager] addBrain:cerebro withIdentifier:@"cerebro"];

и где-то еще:

[SomeThing DoTaskWithBrain:[[BrainManager sharedManager] brainWithIdentifier:@"cerebro"]];
0 голосов
/ 26 января 2011

Я не уверен, что понял ваш вопрос .... но я пытаюсь:)

Почему бы вам просто не определить свойство во втором контроллере для класса (ов) модели и установить его, например, во времяviewDidLoad вашего первого контроллера.

Или у вас есть ссылки во всех ваших контроллерах на классы модели данных.Хорошим местом для управления моделью данных является AppDelegate.

Если вы создаете приложение на основе шаблона «Приложение с разделенным видом» в XCode, вы получите хороший пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...