Отправка данных между классами - PullRequest
0 голосов
/ 06 июня 2011

Кажется, мне не хватает ключевой фундаментальной концепции при передаче данных между двумя классами. Я прочитал еще один пост здесь, и я прокомментирую это через секунду, но вот что у меня есть. В пользовательском классе представления я получил NSMutableDictionary, который работает нормально и сохраняется:

@interface myView : UIView {
}

@property (nonatomic, retain) NSMutableDictionary*myDictionary;

Методы в myView используют myDictionary без проблем. Например, я могу сделать это нормально:

 NSArray*sorted=[[NSArray alloc] initWithArray:[self.myDictionary keysSortedByValueUsingSelector:@selector(compare:)]];

В моем контроллере представления я пытаюсь создать аналогичный массив, используя те же данные в объекте myDictionary из пользовательского класса:

@interface myViewController : UIViewController {

}

@property (nonatomic, retain) IBOutlet myView * myView;

Тогда позже у меня будет:

  NSArray*sorted=[[NSArray alloc] initWithArray:[self.myView.myDictionary keysSortedByValueUsingSelector:@selector(compare:)]];

Однако этот myDictionary всегда пуст. Он не публикуется нигде в myView, поэтому он должен содержать данные. Я попытался удалить "себя" без удачи.

Теперь я прочитал этот похожий пост:

Данные не передаются между классами - Objective-C

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

1 Ответ

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

Тройная проверка ваших розеток! Затем проверьте их снова.

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

self.myView.hidden = NO;

Если вы назначаете новый объект для этой розетки:

self.myView = [[MyCustomViewClass alloc] initWithFrame:someRect];

вы теряете отслеживание представления, созданного для вас в xib, и когда вы пытаетесь получить доступ к ivars этого нового представления:

NSDictionary * aDict = self.myView.myDictionary;

они не будут иметь тех же значений, что и ивары другого представления в xib (на самом деле они, вероятно, будут nil).

Совершенно нормально, что данные передаются в любом направлении. Вам просто нужно иметь соответствующие ссылки. Представление может «отправляться» на контроллер, но ему нужно иметь ссылку на этот контроллер:

// Get a reference to view controller somehow
self.myController = ...;
[self.myController setArray:[self.myDictionary keys...]];

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

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