Форум программистов, компьютерный форум, киберфорум
Наши страницы

Objective-C

Войти
Регистрация
Восстановить пароль
 
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
#1

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

18.10.2014, 17:00. Просмотров 821. Ответов 8
Метки нет (Все метки)

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

XCode: Связь двух UIViewController - Программирование iOS
Всем привет! Начинаю осваивать xCode и одно решение завело меня в тупик. Написал прогресс бар, с анимацией загрузки. Теперь немогу понять,...

Свой UIView - в каком методе добавить KVO ? - Программирование iOS
Есть CustomView,наследник UIView, с кнопкой и индикатором. В коде другого класса использую этот вью и меняю видимость кнопки. При этом...

UISplitViewController vs UIViewController - Программирование iOS
Чистый проект. В Storyboard только UISplitViewController и UIViewController. Как мне выводить UIViewController поверх всего...

Прозрачный UIViewController - Objective-C
Всем привет хочу сделать поверх одного вьюконтролера другой с прозрачностью, выставил альфа каналы , убрал бекграунды, юзал такие варианты...

Состояние UIViewController - Objective-C
Доброго времени суток, стыдно за такой вопрос, но поиск не дал рабочего результата Есть приложение с несколькими ViewController, при этом...

UIViewController поверх - Программирование iOS
Можно ли что-то (UIViewController or UIView или ещё чего нибудь подобного) вывести, показать поверх UISplitViewController

8
Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
18.10.2014, 18:34 #2
Быстрый вариант: передать во второй контроллер ссылку на первый и следить за "firstViewController.number".

Правильный вариант: обернуть number в модель, которая будет передаваться между контроллерами, и за которой они смогут следить независимо друг от друга.
1
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
18.10.2014, 23:22 #3
Правильный вариант: обернуть number в модель, которая будет передаваться между контроллерами, и за которой они смогут следить независимо друг от друга.
Перефразирую

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

Именно так: создать свойство firstViewController во втором контроллере и перед переходом с первого на второй присваивать его туда.
1
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
19.10.2014, 13:57  [ТС] #6
Что мне подсказывает, что в этой ситуации мне не нужен KVO, если я могу с таким же успехом передать нужное значение, вместо viewcontroller'a.
Или вовсе использовать отдельный хедер, в нём обьявить переменную, и её использовать.
Что правильнее в этом случае?
0
Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
19.10.2014, 14:51 #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. код набран на ходу, могут быть неточности.
1
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
19.10.2014, 15:34  [ТС] #8
Melzas,
ну не стоило так подробно, но спасибо.
про глобальные переменные понял.
правда не совсем понятно, зачем оборачивать в модель?
0
Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
21.10.2014, 11:55 #9
Цитата Сообщение от residentkms Посмотреть сообщение
зачем оборачивать в модель?
1. В реальном приложении между контроллерами передается куча данных, а не одно число. Лучше сразу привыкать создавать модели.
2. Наблюдение. если передавать NSNumber без модели, то он будет меняться независимо в разных контроллерах, так как иммутабельный. Централизовано следить за изменениями не получится.
1
21.10.2014, 11:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2014, 11:55
Привет! Вот еще темы с ответами:

обращение к данным uiviewcontroller - Программирование iOS
как взять текст из label.text из одного uiviewcontroller в другой? как обращаться к обьектам других вьюшек?

Метод touchesBegan в UIViewController - Objective-C
Добрый день! Подскажите, а метод - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event непосредственно в контроллере можно...

Не вызывается dealloc в UIViewController при popViewControllerAnimated - Objective-C
Здравствуйте! есть такой код @interface MainController () @property (strong,nonatomic) Model *model; @property...

Navigation controller (UITableviewController вместо UIViewController) - Программирование iOS
Доброго времени суток. Создал первое TabbedApp. Добавляю в проект элемент navigation controller. Он состоит из двух элементов: view...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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