2010-01-14 1 views
5

Я думаю, что мне не хватает чего-то фундаментального, и поэтому я хочу попросить сообщество помочь. Я создаю приложение, основанное на базовом приложении для iPhone. Мой MainView и FlipsideView имеют некоторые элементы, поэтому я создал отдельные ViewControllers и nib-файлы для этих фрагментов. Для этого я сделал следующее: 1. Создал viewcontroller, называемый searchDateViewController, который является владельцем файла searchDateView.xib 2. searchDateView.xib - это в основном UIView с UILabel внутри, вид правильно подключен 3. Внутри обоих MainViewController.m и FlipsideViewController.m добавить подвид, как folllows:superview и parentviewcontroller nil после добавления subview

- (void)loadView{ 
    [super loadView]; 
    searchDateViewController = [[SearchDateViewController alloc] initWithNibName:@"SearchDateView" bundle:nil]; 
    [[searchDateViewController view] setFrame:[searchDateView frame]]; 
    [[self view] addSubview:[searchDateViewController view]]; 

... 
} 

Everything дисплеев и работает просто отлично. В основном в зависимости от действий, которые происходят в каждом из основных и обратных представлений, UILabel из ниба изменяется. Тем не менее, я хотел сделать что-то немного другое, если searchDateViewController загружен из MainView или FlipsideView. Однако я не могу понять, какой ViewController добавляет подпрограмму searchDateViewController.

В searchDateViewController я попробовал:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"superview %@", self.view.superview); 
    NSLog(@"parentviewcontroller %@", self.parentViewController); 
} 

В обоих случаях я получаю ноль.

Итак, мой вопрос: могу ли я узнать, какой ViewController добавляет searchDateViewController a subview? Если да, то как? Или, если моя логика здесь полностью перепутана, как я должен это делать?

Спасибо!

ответ

2

viewDidLoad вызывается, когда контроллер представления загружен свое мнение. В вашем случае, что happends в этой строке:

[[searchDateViewController view] setFrame:[searchDateView frame]]; 

В этот момент, вы еще не называли addSubview: так это не удивительно SuperView вида не равны нулю.

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

Как правило, я не считаю целесообразным использовать подкласс UIViewController в качестве контроллера для представления, которое используется как подсмотр одного или нескольких полноэкранных представлений, а не как полноэкранное представление. Большая часть логики UIViewController работает в предположении, что она используется для управления полноэкранным представлением. Например, с вашим дизайном, я думаю, что возможно, что SearchDateViewController изменит кадр представления при изменении ориентации устройства и т. Д.Поскольку вам не нужны все эти функции для не-полноэкранного поднабора, я предлагаю вам подкласс вашего SearchDateViewController непосредственно из NSObject.

+0

Благодарим за то, что указали мне в правильном направлении относительно subviews и подклассов UIViewController. Если я сделаю SearchDateViewController подклассом NSObject, как это повлияет на то, как я добавляю subviews и инициализацию с помощью nib? Я не нашел примеров subviews как nsobjects, а не viewcontrollers, но я хочу начать использовать любую стандартную практику в этом случае. Дайте мне знать, если у вас есть еще советы - спасибо! Кроме того, вы оба предложили использовать parentcontroller, что имеет смысл, но какую роль играет супервизор? Будет ли это более уместным здесь? – deadroxy

+0

Создание SearchDateViewController подкласса NSObject не устраняет вашу проблему, оно просто предотвращает будущие проблемы, поскольку UIViewControllers на самом деле не предназначены для использования для представлений, которые не занимают всего окна IMHO. Чтобы решить вашу проблему, ваш код настройки просмотра не должен полностью полагаться на self.parentViewController или view.superview. Вместо этого определите свойство в SearchDateViewController (может быть BOOL или перечисление), которое затем запрашивает, чтобы решить, как настроить представление. Объект, создающий SearchDateViewController, должен установить свойство. –

+0

Я сделал так, как вы сказали, создав свойство в классе SearchDateViewController, который отлично работал. Тем не менее, я все еще озадачен тем, как перейти от подкласса UIViewController к UIView/NSObject. В частности, кто станет владельцем файла SearchDateView? Я пробовал каждый путь и все, что я делал, приводит к ошибкам ... – deadroxy

-2

ViewController и виды полностью разделены.

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

Ваш SearchDate viewController не может найти родительский контроллер, потому что вы никогда не назначали его, и система не делает это автоматически. Вы можете просто назначить родительский контроллер, когда вы вызываете представление с другого контроллера.

searchDateViewController.parentController=self; 
+0

Я понимаю, что parentViewController готов только для этого, поэтому я не могу его установить (на самом деле я получаю сообщение об ошибке при попытке). – deadroxy

+0

Быстрое наблюдение - я думаю, вы могли иметь в виду, что Оле сделал, чтобы создать новое свойство внутри SearchDateViewController для хранения этой информации. Это работает, но я все еще беспокоюсь о комментариях Оле об этой стратегии (использования UIViewControllers в качестве подзаголовков), как правило, идет против хороших принципов дизайна ... – deadroxy

+0

Ваше право читается только. Я просто предположил, что это было чтение/запись, потому что контроллер навигации устанавливает атрибут. Интересно, как контроллер навигации устанавливает атрибут? Ole правильно, что наличие нескольких контроллеров на одном и том же видимом экране является плохой практикой. API не поддерживает это легко. – TechZen

 Смежные вопросы

  • Нет связанных вопросов^_^