target-c передавая строки между представлениями - PullRequest
0 голосов
/ 18 июня 2011

Я пытаюсь найти наилучший способ передачи строк между представлениями.

Допустим, например, что пользователь может выбрать, какой вкус эскимо он хочет.В открывшемся окне они нажимают кнопку, которая открывает контроллер табличного представления, в котором отображается таблица из 5 разновидностей.Допустим, пользователь выбирает «Виноград», и контроллер вида немедленно закрывается и возвращается к открытому виду.Как мне передать эти строковые данные «Grape» в контроллер открывающегося вида?

Я немного прочитал о NSUserDefaults и немного поиграл с ним, но мне это кажется немного странным, иЯ не уверен, что это лучшая ставка.Предложения?

Ответы [ 5 ]

3 голосов
/ 18 июня 2011

Есть несколько способов сделать это, вы можете опубликовать уведомление, содержащее объект с выбранной информацией, на которую подписывается ваш начальный вид.Вы разместите это уведомление в тот момент, когда в вашем случае была выбрана эта опция.

Другим вариантом является использование шаблона делегата. Когда вы выбираете эту опцию, вызывается метод делегата для открытия вторичного представления, когда вызывается метод делегата.

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

ДляДалее углубимся в пример делегата, который я выбрал бы.

Определите ваш ColorPickerViewController

@interface ColorPickerViewController

@property (nonatomic, assign) id delegate;
// other supporting properties

@end

@protocol ColorPickerViewControllerDelegate <NSObject>

@optional 
 - (void) colorWasPicked:(UIColor *)pickedColor;

@end

@implementation ColorPickerViewController

@synthesize delegate;

- (void)colorSelected { // some method that is called when the user selects a color
    if([self.delegate respondsToSelect(@selector(colorWasPicked:)]) {
        [self.delegate colorWasPicked:selectedColor];
    }
}

@end

И тогда ваш контроллер начального вида создаст экземпляр ColorPickerViewController и назначит себя в качестве делегата

@interface OpeningViewController : UIViewController <ColorPickerViewControllerDelegate> {


}


@implementation OpeningViewController 

// implement the delegate method you wrote

- (void) colorWasPicked:(UIColor *)pickedColor {

    self.userSelectedColor = pickedColor;

}

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

1 голос
/ 18 июня 2011

Я могу придумать как минимум три разумных подхода:

  1. Родительский контроллер представления извлекает необходимые данные из дочернего контроллера представления.
  2. Дочернему контроллеру представления предоставляется делегат, который обычно является родительским, и он вызывает некоторый метод делегата для доставки любой информации, которую он собрал.
  3. Ребенок публикует уведомление, сообщающее всем, кто хочет слушать, что его данные изменились.

В большинстве случаев я предпочитаю вариант № 1. Родительский контроллер представления уже знает кое-что о дочернем контроллере представления, потому что, в конце концов, именно родитель создает экземпляр дочернего элемента. Родителю также просто сохранить ссылку на ребенка, и когда представление родителя становится видимым, он может легко получить необходимые данные.

Опция # 2 хороша, если вы не хотите, чтобы родитель отслеживал дочерний элемент - он может создать экземпляр дочернего элемента, представить его модально или поместить его в стек навигации, а затем забыть об этом. Также неплохо, если вы хотите получить дополнительную гибкость в отношении получателя данных ребенка. Например, вы можете сделать свою модель данных дочерним делегатом, а не родительским контроллером представления, и выбранный вариант (или любой другой) может быть доставлен непосредственно в модель.

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

Система по умолчанию удобна в использовании, особенно для небольших данных, но IMO лучше рассматривать ее как механизм хранения, а не как канал связи.

0 голосов
/ 18 июня 2011

Для этой цели вы можете использовать NSNotifications.

0 голосов
/ 18 июня 2011

Я думаю, что реальный способ думать об этом - это концептуализировать вашу проблему в терминах Модель, Представление, Контроллер, то есть, как вы должны подходить ко всем проблемам на основе Какао, что часто подтверждается документацией Apple.

Ваши два представления, это Представления, они должны касаться только взаимодействия с пользователем (отображать информацию, принимать данные).

Должен быть Контроллер (множественное число?), Этот контроллерзнает, что существует 2 представления, и позволяет представлениям взаимодействовать с данными .. это модель .

модель на самом деле имеет переменную с именем NSString *flavor;,Он содержит эту информацию.Любое Представление , через интерфейс с Контроллером , получает ту же переменную разновидность для отображения или модификации.

Напомним: вы решаете свою проблему, имея данные в 1место, модель . Контроллер существует для подключения этих данных к нескольким представлениям , которые не имеют представления о том, где хранятся эти фактические данные.

0 голосов
/ 18 июня 2011

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

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