Форум программистов, компьютерный форум CyberForum.ru

Обмен свойствами двух UIViewController посредством KVO - Objective-C

Восстановить пароль Регистрация
 
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
18.10.2014, 17:00     Обмен свойствами двух UIViewController посредством KVO #1
Имеется 2 вьюконтроллера. В первом есть @property number. Во втором нужно отследить его изменение.
Использую метод во втором:
Objective-C
1
[(?) addObserver:self forKeyPath:@"number" options:NSKeyValueObservingOptionNew context:nil];
Проблема одна. Как мне указать на первый вью контроллер?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2014, 17:00     Обмен свойствами двух UIViewController посредством KVO
Посмотрите здесь:

Двумерные массивы, поиск элементов с заданными свойствами, обмен Pascal ABC
Объединение двух сегментов сети посредством третьей
Обмен содержимым файлов посредством дополнительного файла C++
Свой UIView - в каком методе добавить KVO ?
XCode: Связь двух UIViewController
Вывод дроби посредством ООП Objective-C
Objective-C Прозрачный UIViewController
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Melzas
 Аватар для Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
18.10.2014, 18:34     Обмен свойствами двух UIViewController посредством KVO #2
Быстрый вариант: передать во второй контроллер ссылку на первый и следить за "firstViewController.number".

Правильный вариант: обернуть number в модель, которая будет передаваться между контроллерами, и за которой они смогут следить независимо друг от друга.
noname_club
 Аватар для noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 577
18.10.2014, 23:22     Обмен свойствами двух UIViewController посредством KVO #3
Правильный вариант: обернуть number в модель, которая будет передаваться между контроллерами, и за которой они смогут следить независимо друг от друга.
Перефразирую

Правильный вариант: обернуть number в модель, которая через NSNotificationCenter будет оповещать всех на нее "подписанных" контроллеров, что значение изменилось
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
19.10.2014, 08:49  [ТС]     Обмен свойствами двух UIViewController посредством KVO #4
Цитата Сообщение от Melzas Посмотреть сообщение
Быстрый вариант: передать во второй контроллер ссылку на первый и следить за "firstViewController.number"
но как передать ссылку?
не считая его инициализации перед переходом, присвоение значения к какому нибудь выделенному свойству, и push в стек.
Melzas
 Аватар для Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
19.10.2014, 12:27     Обмен свойствами двух UIViewController посредством KVO #5
Цитата Сообщение от residentkms Посмотреть сообщение
не считая его инициализации перед переходом, присвоение значения к какому нибудь выделенному свойству, и push в стек.
Почему не считая?

Именно так: создать свойство firstViewController во втором контроллере и перед переходом с первого на второй присваивать его туда.
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
19.10.2014, 13:57  [ТС]     Обмен свойствами двух UIViewController посредством KVO #6
Что мне подсказывает, что в этой ситуации мне не нужен KVO, если я могу с таким же успехом передать нужное значение, вместо viewcontroller'a.
Или вовсе использовать отдельный хедер, в нём обьявить переменную, и её использовать.
Что правильнее в этом случае?
Melzas
 Аватар для Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
19.10.2014, 14:51     Обмен свойствами двух UIViewController посредством KVO #7
Смотря что нужно достичь.

Цитата Сообщение от residentkms Посмотреть сообщение
использовать отдельный хедер, в нём обьявить переменную, и её использовать
Нет, глобальные переменные - это плохо.

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

Рецепт:
1. Создать класс модели:
Objective-C
1
2
3
4
@interface NumberModel : NSObject
@property (nonatomic, strong) NSNumber *number;
 
@end
2. В первом контроллере создать свойство для NumberModel:
Objective-C
1
2
3
4
@interface FirstViewController : UIViewController
@property (nonatomic, strong) NumberModel *numberModel;
 
@end
3. В первом контроллере инициализировать модель, установить number и наблюдать за его изменениями:
Objective-C
1
2
3
4
5
6
7
-(void)viewDidLoad {
    [super viewDidLoad];
 
    NumberModel *numberModel = [NumberModel new];
    numberModel.number = @(42);
    [self addObserver:self forKeyPath:@"numberModel.number" options:NSKeyValueObservingOptionNew context:nil];
}
4. Во втором контроллере создать свойство для NumberModel и передавать туда ссылку на модель из первого
Objective-C
1
2
3
4
@interface SecondViewController : UIViewController
@property (nonatomic, strong) NumberModel *numberModel;
 
@end
Objective-C
1
2
3
4
5
6
-(IBAction)onAction:(id)sender {
    SecondViewController *secondViewController = [SecondViewController new];
    secondViewController.numberModel = self.numberModel;
 
    [self.navigationController pushViewController:secondViewController animated:YES];
}
5. Теперь если второй контроллер изменит содержимое numberModel.number, то первый получит уведомление и сможет обновить свой вид/сделать что-то еще.

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

P.S. код набран на ходу, могут быть неточности.
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
19.10.2014, 15:34  [ТС]     Обмен свойствами двух UIViewController посредством KVO #8
Melzas,
ну не стоило так подробно, но спасибо.
про глобальные переменные понял.
правда не совсем понятно, зачем оборачивать в модель?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2014, 11:55     Обмен свойствами двух UIViewController посредством KVO
Еще ссылки по теме:

Objective-C Метод touchesBegan в UIViewController
Objective-C Не вызывается dealloc в UIViewController при popViewControllerAnimated
Objective-C Состояние UIViewController

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Melzas
 Аватар для Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
21.10.2014, 11:55     Обмен свойствами двух UIViewController посредством KVO #9
Цитата Сообщение от residentkms Посмотреть сообщение
зачем оборачивать в модель?
1. В реальном приложении между контроллерами передается куча данных, а не одно число. Лучше сразу привыкать создавать модели.
2. Наблюдение. если передавать NSNumber без модели, то он будет меняться независимо в разных контроллерах, так как иммутабельный. Централизовано следить за изменениями не получится.
Yandex
Объявления
21.10.2014, 11:55     Обмен свойствами двух UIViewController посредством KVO
Ответ Создать тему
Опции темы

Текущее время: 15:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru