Управление View Controllers в порте iPad - PullRequest
1 голос
/ 28 октября 2010

У меня есть приложение, которое я разработал для iPhone, но теперь хочу портировать на iPad. Приложение для iPhone выполнено в стиле навигации и основано на контроллерах дискретных табличных представлений, управляемых навигационным контроллером. Благодаря большому экрану iPad у меня есть возможность одновременно разместить на экране пару контроллеров табличного представления.

Вопрос в том, как? Должен ли я

a) чтобы основной вид загрузил два контроллера табличного представления из отдельных NIB, а затем разместил их на экране (я не уверен, как установить x и y для подпредставлений, загруженных из nib).

b) создать подвиги в моем главном перо и заполнить их данными из моих существующих классов (если да, то как мне подключить IBOutlets)?

в) сделать что-то совершенно другое

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

1 Ответ

4 голосов
/ 29 октября 2010

Предупреждение! Этот QA теперь имеет только историческую ценность.

Теперь тривиально делать подобные вещи с представлениями контейнеров в iOS, поэтому Apple отредактировала их:

https://stackoverflow.com/a/25910881/294884

Как добавить подпредставление с собственным UIViewController в Objective-C?


Исторический ответ ...

«.. как я устанавливаю их x и y для подпредставлений, загруженных из перьев?»

Я не уверен, полностью ли я понимаю ваш вопрос, Фил, но вот простой и понятный способ:

Запустите конструктор интерфейса и в новом увеличенном представлении iPad просто добавьте новые уменьшенные представления (UIViews) ... Расположите их именно там, где и как вы хотите. Мы будем называть эти «корзины» представления.

Допустим, одно из ваших сложных представлений из другого приложения - это представление fatDogs. Вызовите новую корзину просмотра fatDogsBasket. Затем в коде, в viewDidLoad, просто сделайте следующее со всеми этими "корзинами" ...

[fatDogsBasket addSubview:fatDogs.view];
[clientsBasket addSubview:clients.view];
[namesBasket addSubview:names.view];
[flashingLightsBasket addSubview:flashingLights.view];
// etc

Вы сделали! (Очевидно, убедитесь, что все соответствующие контроллеры представлений, fatDogs, flashingLights и т. Д. Все готовы к работе и созданы.)

Система «корзина» удобна, поскольку каждая из них будет хранить вашу предыдущую работу в одном месте; с пользой (скажем) вы можете установить общую невидимость или что-то еще, просто коснувшись корзины. Очевидно, что если вы хотите установить или, возможно, переместить положение корзины в коде, просто наберите

happyBasket.frame = CGRectMake(509,413,
    happyBasket.frame.size.width,
    happyBasket.frame.size.height);

UIViews в iOS очень легковесны, поэтому нет проблем с добавлением еще одного слоя UIViews.

Надеюсь, это то, к чему вы пришли!

------ Позже ...

Вы продолжали спрашивать: «Просто чтобы убедиться, что я четко определил правильный способ реализации этого. Контроллер основного вида имеет IBOutlets для каждой из« корзин »и это соединение IBOutlet с подпредставлением, которое я». м вызова. Каждый из контроллеров представления, которые я собираюсь показать в каждой корзине, имеет собственный кончик и связанные IBOutlets. Верно? - "

Итак, «Контроллер основного вида имеет IBOutlets для каждой из« корзин »» ...

Правильно, основной вид в новом приложении будет иметь такие строки в файле .h:

IBOutlet  UIView  *fatDogsBasket;

Обратите внимание, что вы просто объявляете "fastDogsBasket" как UIView. Вы не должны слишком беспокоиться о слове "IBOutlet". Все это означает: «Мне нужно иметь возможность найти этот элемент в контроллере интерфейса». Важно понять, что ЭТО НИЧЕГО не делает.

Так что да, все "корзины" будут UIViews, и, следовательно, вы, конечно, должны сделать это как таковые в файле .h вашего контроллера основного вида. Лично это не будет использовать фразу «контроллер представления имеет IBOutlets». Это как-то сбивает с толку и дает неверное представление. Просто скажите «не забудьте пометить UIViews как заголовки в заголовочном файле».

Так или иначе, да, это именно то, что вы делаете, объявите все UIViews «корзины» в файле .h основного контроллера и действительно отметьте их все как IBOutlets, чтобы построитель интерфейса работал легче. Далее ..

«это соединение IBOutlet с подпредставлением, которому я звоню» - это неправильно.

Такая корзина, как fatDogsBasket, ПРОСТО УВИДЕТЬ, и все. Это просто UIView.

Теперь, как вы знаете, вы можете поместить UIViews в другие UIViews. (Очевидно, что это обычное дело, каждый UIView имеет множество UIViews внутри него и так далее и тому подобное - это самая основная часть построения интерфейса.)

Итак, что вы собираетесь поместить в свое представление fatDogsBasket? Вы собираетесь добавить ВСЕ ВАШЕЙ ПРЕДЫДУЩЕЙ РАБОТЕ на толстых собак! Ранее (для iFone) вы написали замечательный класс - контроллер представления - под названием fatDogs. (Возможно, у него даже было много подклассов и т. Д.)

Теперь мы собираемся взять представление из fatDogs (конечно, это fatDogs.view) и буквально поместить его в fatDogsBasket. (Вспомните, что fatDogsBasket - это UIView.)

Итак, во-первых, вы должны полностью включить свой удивительный класс fatDogs (из старого проекта) в ваш новый проект.Нажмите «добавить существующие мухи / классы» или что-то в этом роде ... вы поймете это.Да, добавьте все файлы классов, xibs, любые подклассы и т. Д.

Затем просто сделайте это .. в вашем новом сверхмощном контроллере uber, в viewDidLoad, просто выполните следующее со всеми "корзины "...

[fatDogsBasket addSubview:fatDogs.view];
[clientsBasket addSubview:clients.view];
[namesBasket addSubview:names.view];
[flashingLightsBasket addSubview:flashingLights.view];
// etc

Готово!Обратите внимание, что представление из fatDogs (т.е. fatDogs.view) теперь отображается внутри UIView fatDogsBasket.Класс fatDogs теперь будет работать полностью нормально, как это было в старые времена!И что невероятно, вы можете легко (здесь, в вашем новом контроллере) делать такие вещи, как простое перемещение fatDogsBasket, и оно будет легко перемещать представление fatDogs сразу, не беспокоясь о деталях fatDogs и его представлениях.

НаконецВы спрашиваете ..

"Каждый из контроллеров представления, которые я собираюсь показать в каждой корзине, имеет свой собственный кончик и связанные IBOutlets."

Точно правильно.Когда вы добавите старую систему «fatDogs» в новый проект, вы добавите все ее файлы xib и так далее.Все, что происходит или не происходит внутри этих классов, возможно, с помощью кнопок или чего-либо еще, помеченного как iboutlets, или чего-либо еще, в этих классах будет все равно.Я уверен, что абсолютно НИЧЕГО не изменится, когда вы будете использовать эти старые классы в своем новом проекте.

Только для записи ... "Каждый из контроллеров представления, который я собираюсь показать в каждой корзине ...«Чтобы быть точным, вы не показываете как контроллер вида, вы показываете представление контроллера (!!).Другими словами, для fatDogs (контроллера представления) вы будете показывать его представление, которое достаточно просто называется fatDogs.view.(«view» - это, конечно, свойство любого UIViewController, так что вы можете просто сказать vcName.view и все готово.)

Надеюсь, это поможет!

И, наконец, вы спрашиваете.................................

"У меня все в порядке, но мойкорзины отображаются пустыми, то есть они не отображают представления импортированных контроллеров представления. "

  1. Tell - это имя одного из ваших классов UIViewController из старогопроект, так что мы можем быть конкретными

  2. Допустим, у вас есть старый UIViewController под названием HappyThing.Таким образом, у вас, скорее всего, будет файл HappyThing.h, файл HappyThing.m и файл HappyThing.xib.

  3. , поместите все эти данные в новый проект, вы должны сделать это с помощью Add-> Существующие файлы.(Управляйте одним из ваших текущих имен файлов в списке слева в XCode.)

  4. Вам нужно будет сделать это #import "HappyThing.h" где-то или другим в вашем новом проекте.- либо в вашем файле Prefix.pch, либо в верхней части вашего нового UIControllerView

  5. Для ясности в HappyThing.h у вас будет строка кода @interface HappyThing: UIViewController

  6. В вашем новом файле UIViewController.h вам нужно будет добавить новую переменную, мы назовем ее xxx,

    HappyThing * xxx;

Обратите внимание, что тип xxx - HappyThing.(Обратите внимание, что, как правило, вы должны использовать соглашение об именах "happyThing" (обратите внимание на строчную букву "h"), а не "xxx", но это просто переменная, и я хочу, чтобы вам было ясно, что это просто переменная.)

Следующий!На данный момент это просто переменная, которая ни на что не указывает, это ничто.(Как будто вы сказали «int x», но на самом деле не сказали «x = 3» или что-то в этом роде.) Так!В вашем коде вы должны фактически создать xxx.

xxx = [[HappyThing alloc] init];[xxxBasket addSubview: xxx.view];

Обратите внимание, что первая строка - это то, что делает экземпляр HappyThing существующим.И, конечно, вы хотите использовать «xxx» для указания на этот экземпляр.

Вторая строка помещает вид в соответствующую корзину!Обратите внимание, что, конечно же, вам нужно представление, связанное с xxx (т. Е. Xxx.view) ... помните, что xxx - это UIViewController, но он не является UIView.Связанный UIView - "xxx.view".(Представление буквально является просто свойством ххх.)

Управление памятью!Обратите внимание, что вы использовали «alloc», чтобы привести xxx к существованию.Это означает, что вы им владеете, и, конечно, это означает, что вам НЕ нужно отправлять удержание туда.Кроме того, поскольку вы им владеете, это означает, что вы в конечном итоге должны отпустить его.(легко ... [xxx release];)

Так что просто добавьте строку [xxx release];к процедуре dealloc в вашем новом UIViewController.(На самом деле это не принесет никакого вреда, если вы забудете это сделать, но все равно сделайте это.) Возможно, вы захотите выпустить его раньше по какой-то причине, когда вам будет более комфортно с этим процессом.

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

Так что теперь вы должны ВИДЕТЬ ЭТО НА ЭКРАНЕ!

Не забудьте, если у вас ранее была какая-то подпрограмма в HappyThing, которую вы должны были вызвать, чтобы она заработала (возможно, «beginProcessing» или что-то в этом роде), вам придется самому вызывать это из нового UIViewController.Следовательно, возможно, что-то вроде:

xxx = [[HappyThing alloc] init];
[xxxBasket addSubview:xxx.view];
[xxx beginProcessing];
[xxx showAmazingRedFlashingLights]; // or whatever

Наконец, вы спросили ...

"Когда вы используете эту технику, вы просто включаете заголовки импортированных файлов в свой контроллер основного представленияили вы пересылаете их каким-то образом? "

Это была не ваша проблема, ваша проблема заключалась в том, что вы не создавали ее с помощью строки xxx = [[HappyThing alloc] init] ;.Итак, удачи!

Что касается строки кода "@class HapyyThing", если вы хотите просто поместить ее чуть выше начала определения вашего нового UIControllerView.Как правило, нет необходимости, если у вас есть включаемая строка в лучшем месте.Во всяком случае, это не связанная проблема.Он просто не скомпилируется, если ваш новый UIViewController не может найти HappyThing.Наслаждайтесь!

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