Как обновить вид снаружи контроллера в xcode

До сих пор я только обновлял представление из своего контроллера. Теперь я нахожусь в другой ситуации, когда мне нужно обновить элемент в представлении (текстовая метка) на основе некоторого события, происходящего в другом классе C моего приложения. Я понимаю, что это просто, но я не понимаю, как правильно с этим справиться.

  • Должен ли я передавать свой контроллер представления в методе инициализации C? (Кажется громоздким передавать контроллер представления всякий раз, когда я инициализирую этот класс C. Также потребуется куча рефакторинга.)

  • Должен ли я получить делегат приложения из C, вызвав делегат [[UIApplication sharedApplication]], а из делегата приложения получить нужный мне контроллер представления?

Ни один из подходов не кажется мне практичным или элегантным.

Есть ли способ лучше?


person Lolo    schedule 17.06.2012    source источник


Ответы (1)


Двумя наиболее распространенными методами являются делегирование и уведомление.

В одном случае вы даете классу C свойство делегата и устанавливаете его в качестве контроллера представления. Чтобы это выглядело хорошо, вы можете определить протокол делегата, аналогичный тому, что делается для многих классов API. Его может передать в init, но стандартно просто установить свойство напрямую.

Другой способ — заставить контроллер представления прослушивать уведомление, которое класс C отправляет при возникновении события. Затем контроллер представления выполняет обновление, когда получает уведомление.

person Phillip Mills    schedule 17.06.2012
comment
Спасибо. Похоже, что в моем случае может подойти протокол. Я попробую. Я не совсем уверен, что вы имели в виду под вторым решением. Если бы класс C мог отправить уведомление, это означало бы, что он имел бы доступ к экземпляру контроллера представления, и в этом случае было бы так же просто вызвать метод в этом контроллере представления для соответствующего обновления представления, не так ли? - person Lolo; 18.06.2012
comment
Нет, объект, отправляющий уведомление, отправляет его в центр уведомлений, и ему все равно, кто его слушает. Центр уведомлений просто передает его любому объекту, который зарегистрировался для его прослушивания. Это еще более слабая связь, чем делегат. - person Phillip Mills; 18.06.2012
comment
Если уведомления такие гибкие, оба предложенных вами метода кажутся идеально подходящими в моем случае. Есть ли компромисс между использованием протокола делегата и использованием уведомления, которое предполагает, что один метод более подходит в моем случае? - person Lolo; 19.06.2012
comment
В какой-то момент в него вступают личный вкус и философия. Смысл (почти определение) делегата - это объект, который берет на себя часть того, что наиболее разумно является ответственностью какого-либо другого объекта. Однако когда вы говорите о реакции на событие, это главная территория для уведомлений. Несмотря на эти моменты, пишется много кода, в котором делегаты используются только для передачи одного значения. Я бы, вероятно, использовал уведомление, но я, вероятно, тоже был бы в меньшинстве. Очень полезно, не так ли? :) - person Phillip Mills; 19.06.2012