Как ссылаться на значения объекта из подпредставления? - PullRequest
1 голос
/ 14 марта 2010

У меня есть UIViewController с XIB и я хочу программно добавить другое подпредставление.

Во время инициализации подпредставления (initWithFrame) я хочу установить некоторые атрибуты в значения в соответствии с атрибутами, которые принадлежат другому объекту, который содержит данные (фактически дочерний объект ViewControllers, но не представление).

-(id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {

        // The following is kind of what i want
        self.myAttribute = [self.viewController.otherObject otherValue]; 
    }
    return self;

}

Я хочу соответствовать парадигме Model-View-Controller и попытаться отделить мои данные от подпредставления и не знаю, как получить доступ к данным из подпредставления.

Заранее спасибо за любые ответы и комментарии, как улучшить вопрос.

РЕДАКТИРОВАТЬ: Все три ответа полезны для меня, чтобы понять, что мой дизайн как-то неправильный способ сделать вещь. Насколько я понимаю, свойства подпредставления должны быть изменены контроллером вместо попытки создания подпредставления для получения информации. Я приму ответ Джейсона за его усилия, объяснив это мне.

Ответы [ 3 ]

1 голос
/ 14 марта 2010

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

1 голос
/ 14 марта 2010

Простое решение для общей проблемы инициализации подпредставления с атрибутами - написать собственный инициализатор в вашем подклассе.

-(id) initWithFrame:(NSRect) aFrame andAttribute:(SomeClass *) anAttribute{
    if (self=[super initWithFrame:aFrame]) {
        self.attribute=anAttribute;
    }
    return self;
}

Вы бы инициализировали объект так:

MySubviewClass *msc=[[MySubviewClass alloc] initWithFrame:frame andAttribute:[self.viewController.otherObject otherValue]];

Это будет работать нормально, если вы говорите о подпредставлении, управляемом тем же контроллером, то есть это подпредставление controllers.view. Если вы загружаете другое представление, вам нужно пройти маршрут data-model / navigation-controller.

1 голос
/ 14 марта 2010

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

  1. Фактические глобальные переменные (размещенные в одном файле .m и объявленные в общем файле .h). Не рекомендуется, за исключением редких случаев, когда у вас есть, например, статические данные, с которыми следующие подходы кажутся глупыми для использования.

  2. Общий (одноэлементный) объект контроллера, которому принадлежат общие данные. Тогда вы можете, скажем, [[AppController sharedController] otherValue] и получить к нему доступ из любого места в вашем приложении. Это хорошо для того, что вы можете назвать общими свойствами или настройками в вашем приложении. Как правило, вы не будете использовать это для передачи информации, относящейся к представлению.

  3. Если данные относятся к конкретному представлению, вы можете «поехать» с иерархией контроллера представлений, передавая их из одного контроллера представления в другой по мере создания и передачи контроллеров. Затем, когда вы создаете сами представления, как описано выше, не ищите свойство в методе initWithFrame, а задайте свойство для представления, которое можно установить для вставки данных сразу после создания представления.

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