2009-12-16 1 views
6

Каков наилучший подход к реализации вкладок, которые выглядят как веб-приложения на iPhone, например, снимок экрана ниже (обратите внимание на вкладки «Checkin-Info-Friends»)? Они не являются частью стандартной библиотеки UIKit, но, похоже, в последнее время очень распространены.Веб-вкладки для iPhone

Я потратил значительное время на разработку приложений для iPhone, но не разработал элементы управления, подобные этому. Какой был бы наилучший подход здесь:

  • создать новый UIView для каждого содержимого вкладки и сразу же добавить три подпрограммы в mainview?
  • создавать новые UIView только тогда, когда пользователь нажимает на каждую из вкладок?
  • Поместите весь контент в UIScrollView и просто измените страницу, когда пользователь нажимает на каждую вкладку?

Возможно, существуют элементы управления с открытым исходным кодом? Я ничего не мог найти.

alt text http://www.foursquaregame.com/foursquare-game-images/foursquare-game-mobile-app.jpg

ответ

3

Мой подход к аналогичной задаче было сделать все 4 (в моем случае) представления с закладками, но реагировать на didReceiveMemoryWarning освободив все, кроме текущего вида вкладок. (Тогда, конечно, вы должны убедиться, что вы создаете новое представление, если оно не существует, когда пользователь выбирает новую вкладку.)

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

+0

Таким образом, у вас будет один элемент управления tabview, но 4 вида, каждый из которых включает «think coffee» и вкладки (из рисунка выше)? –

+0

В вашем случае у меня будет 1 контроллер табуляции, один базовый вид с «think coffee», а затем 3 меньших вида вкладок для нижней части экрана, по одному для каждой вкладки. (Сохранение памяти, если представления вкладок не являются полноэкранными.) –

+0

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

1

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

Я думаю, что с такой небольшой нагрузкой на область загрузки или разгрузки на уровне подвешенности вряд ли будет проблемой, но если родительские представления необходимо загрузить/разгрузить, все объекты должны быть скрыты и разгружены), а при перезагрузке loadView должен вызвать процедуру, описанную в последнем абзаце при запуске.

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

Действительно ли это верно? Есть ли какие-то дополнительные детали, которые мне не хватает?

1

У вас может быть каждая вкладка - это контроллер реального вида с наконечником и всем. Единственный улов в том, что вы должны пересылать вызовы контроллера стандартного представления, которые вы хотите получать (viewWillAppear и т. Д.), Но это делает кодирование намного более чистым, поскольку вы кодируете так же, как и для любого другого вида (хотя и для меньшего пространства).

Вы вызываете каждое свойство «view» каждого контроллера, чтобы получить представление, которое вы добавляете в качестве подсмотра представления контейнера, которое у вас есть под вкладками.

1

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

Для самих вкладок рассмотрите подклассы UISegmentedControl.

+0

Спасибо за ответ, Фрэнк. Не все представления представляют собой таблицы, я должен был упомянуть об этом. Отличная идея UISegmentedControl. –

+0

Привет, Франк, я не мог понять, как подкласс UISegmentedControl и заменить метод рисования, чтобы выводить мои собственные изображения. Не могли бы вы представить, какой метод я должен переопределить? –

+1

У меня нет много (ну, и вообще) опыта подклассификации элементов пользовательского интерфейса. Вы можете переопределить метод 'drawRect', использовать' [super widthForSegmentAtIndex] 'для захвата ширины и' [super selectedSegmentIndex] ', чтобы узнать, какой из них выделить. Вы также можете пройти дерево subview и сообщить любым UILabels, чтобы нарисовать себя. Но я не уверен, как далеко вы можете пройти, прежде чем находитесь на недокументированной территории отказа API. –

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