Приложение делегировать выделенный объект отображается в нескольких подпредставлениях? - PullRequest
0 голосов
/ 04 января 2012

Я в некотором роде здесь. Создание игры для iOS, которая содержит, скажем, два представления: BaseView и MapView.Теперь у них, конечно, один и тот же appDelegate.

Оба используют подкласс UIView с именем rivbox .В более ранних сборках я выделял экземпляр rivbox как в базовом представлении, так и в представлении карты.Когда я понял, что у меня будет много подпредставлений, использующих этот rivbox, я вместо этого решил выделить только ОДИН экземпляр rivbox в appDelegate, а затем, когда подпредставление загружено, получает возможность «одолжить» rivboxиз appDelegate с помощью этих изящных функций.

-(void)viewDidLoad {
//Get all the sweets from the parent!
    appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    rivbox = appDelegate.rivbox;
    [self.view addSubview:rivbox];
...
}

И эта функция предназначена для обновления владельца, если мы снова вернемся к этому представлению

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if(rivbox != nil) {
        [rivbox setDelegate:self];
        [self.view addSubview:rivbox];
    }
}

Это прекрасно работает!Я нахожу rivbox в appDelegate, и он обновляется!Когда я перехожу на другой вид, он загружается там тоже просто отлично!Но когда я возвращаюсь к первому виду, это, кажется, протекает?!?!Я не вижу rivbox в моем предыдущем представлении, когда возвращаюсь к нему, хотя предыдущему представлению теперь принадлежит его!

Проблема: что с этим не так?Действительно ли мне нужно добавлять rivbox в качестве подпредставления каждый раз, когда я возвращаюсь к просмотру, которое уже было загружено?Если я удалю эту строку, то не смогу увидеть MyBox, когда вернусь к предыдущему виду.

Ответы [ 2 ]

2 голосов
/ 04 января 2012

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

Из Документы Apple :

Делегат приложения - это пользовательский объект, созданный во время запуска приложения, обычно с помощью функции UIApplicationMain.Основная задача этого объекта - обрабатывать переходы состояний в приложении.Например, этот объект отвечает за инициализацию во время запуска и обработку переходов в фоновый режим и из него.

Обращаться к делегату приложения для всего остального похоже на использование глобальных переменных.С самого начала это выглядит как легкий путь, но может быстро привести к путанице, поскольку ваша кодовая база растет.

Делегат приложения - это то, что он говорит - объект делегата UIApplication.Создаваемые представления не имеют ничего общего с UIApplication, поэтому их не должно быть рядом с делегатом.

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

Какое преимущество вы ощущаете, создавая этот сингл rivbox?

0 голосов
/ 04 января 2012

Этого должно быть достаточно для обоих контроллеров:

- (void)viewWillAppear:(BOOL)animated {
  //Get all the sweets from the parent!
  appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  [self.view addSubview:appDelegate.rivbox];
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...