-
Привет!
Наткнулся на сайт благодаря Хабре и айФону. по статьям и форумам понял, что тут собираются люди которые не первую неделю кодят для Кокоа. Поэтому кое как расчитываю на вашу помощь программисту, которому тяжело перестроится после Delphi и C# :-). А вообще, у меня ситуация такая: год назад купил айФон, поставил тулЧеин и писал небольшие программки в свою пользую. ну и заодно хвастался начальству, что мол какой я сотрудник, умею позновать новое и т.п. И недавно начальство меня попросило написать для внутренних нужд агенства программу, по выбору клипарта. И если для тулЧейна вроде идеология понятна, то с приходом SDK и MVC - стало тяжко.
Уже три недели гуглю, читаю доки, форумы и т.п. смотрю туториалы, но всегда спотыкаюсь на то, что в них рассказывается
как кодить примитив не усложняя задачу, ну или не то, чтобы усложняя, а скажем так зайти с другого хода.
Вот вобщем архитектурный вид моего App
Т.е. если в общем и целом, то хочу написать программу, в основе которой лежит
UITabView(Controller) и в каждой UITabBaritem свой UIView с UINavagationContoller
Как я поянл - это самая часто встречаемая проблема
UITabBarController + UINavigationController
Если посмотрите на картинку и там на суб-кортинку "а.1", то увидите, что
по default-у IB предлагает нам подгружать "под-GUI" ниб файлов(Loaded From SecondView.nib).
Так вот в настоящий момент меня интересует:
1) насколько верно выносить GUI(UIView,UINavigationController) в отдельные файлы? Даже FirstView in uitabbar?
2) для чего надо настраивать тип класса для каждого "UITabBaritem"? см картинку "a.2"?
Я думал, что это как-бы тип "коннектора" к которому должен кконектиться в nib файле UITabBAr при выборе соответствующего item-а. Но как я понял, это заблуждение. отсюда третий вопрос:
3) Как вынести UINavigationController и сопутствующее (т.е. сделать листалки с таблицами)в отдельный nib файл, но чтобы его можно было бы задействовать в UITabBarViewController-e?
Как мне думается, идеалогия MVC строится на том, что "мухи отдельно, котлеты отдельно".
Поэтому в MainView.nib я хочу настраивать только uitabbarview(ну и чтобы он отвечал только за то, чтобы переключать view)
, а в других nib-ах, другие логические части программы.
Пробывал тупо указывать имя nib-а, а в дочернем нибе приделывать UINavigationController - не работает.
А вот если UINavigationController реализовывать в MainView.nib, т.е. там же где и UITabBarController,
то всё хорошо.
В общем это первая порция вопросов :-)
Предлагаю активно учавствовать в дискуссии, я потом выложу исходники проекта.
С уважением, iBeginner -
Сейчас опишу логику программы:
№0 - это стартовый экран программы.
MainView.nib загружает UITabBArController, который грузит для первого selected item-а CatalogView.nib который содержит следущее:
4 картинки в центре - это кнопки, типа категории. тап-ая их мы в вавливаемся в иерархический каталог(1.1,1.2), у которого могут быть несколько вложений (1.2->1.2->1.2) и заканчивается дело тем, что показывает картинку.
Тут загвоздка в том, чтобы сверху спрятать верхний UITabBar. я ему пытался прописать в IB hiden =true, но что-то не работает. Прятать его хочу, чтобы весь nib был основан на UINavigationController, а не частично на UIViewCotroller+UINavigationController.
Вобщем это первый tabBarItem, и он вроде самый сложный.
tabBarItem = 2 (картинки 2.1, 2.2) - там просто избранное, и кликая на нём мы сразу же видим картинку
tabBarItem = 3 (картинка 3.1) - просто UIView c информацией о версии программы и т.п. -
1) насколько верно выносить GUI(UIView,UINavigationController) в отдельные файлы? Даже FirstView in uitabbar?
Вернее некуда. Модуляризация, даже если и кажется ненужной сейчас, спасет тебя в будущем. Эппл "хочет", чтобы ты сделал так; поверь, так и надо.
2) для чего надо настраивать тип класса для каждого "UITabBaritem"? см картинку "a.2"?
Ну, чтобы система знала, что делать. Поставишь Navigation Controller — будет тебе Navigation Bar сверху автоматически. Хочешь сам Navigation Bar рисовать — ставь тип View Controller и добавляй в свой View навигацию сам. Не уверен, что будет происходить в случае последних двух опций.
3) Как вынести UINavigationController и сопутствующее (т.е. сделать листалки с таблицами)в отдельный nib файл, но чтобы его можно было бы задействовать в UITabBarViewController-e?
Немного не понял вопроса. Бери и выноси, что мешает-то? :) Вообще в твоем случае можно обойтись без отдельного UINavigationController'a — для каждого View создавай ViewController, в котором сам настраивай кнопки на Navigation Bar, которые при нажатии будут делать либо push: либо pop: на местном NavigationController'e.
Тут загвоздка в том, чтобы сверху спрятать верхний UITabBar.
TabBar вроде снизу. Или я что-то не понимаю?
З.Ы. Привет свитчеру с C# от свитчера с C#! :) -
Я вот что хотел сказать своими постами:
у меня было(есть) желание, чтобы файл MainView.nib управлял (читай показывал) через UITabBarController другие 3 nib файла (CatalogView, FavView, InfoView). И при этом чтобы MainView.nib не волновало, что внутри них ( UIViewController, UITableViewControoler, а может в нибе ещ] один UITabBarController )
Т.е. когда увидел надпись: Loaded From SecondView.nib мне отчего-то подумалось, что при таком раскладе UITabBarController-y( который снизу :-) ) будет пофигу что будет в загружаемых ниб-ах
а оказывается нет? -
2) для чего надо настраивать тип класса для каждого "UITabBaritem"? см картинку "a.2"?
Ну, чтобы система знала, что делать. Поставишь Navigation Controller — будет тебе Navigation Bar сверху автоматически. Хочешь сам Navigation Bar рисовать — ставь тип View Controller и добавляй в свой View навигацию сам. Не уверен, что будет происходить в случае последних двух опций.
а зачем ей знать? пускай грузит nib и не волнуется за то, что будет проиходить в дочернем sub-view
видишь, если поставить в MainView.nib сразу UINavigationController, то сразу же будет рисоваться вверху табБар. А мне хочется, что бы он рисовался после(благодаря тому) что я загружу nib в котором он будет и в котором будет реализована его логика
Немного не понял вопроса. Бери и выноси, что мешает-то? :) Вообще в твоем случае можно обойтись без отдельного UINavigationController'a — для каждого View создавай ViewController, в котором сам настраивай кнопки на Navigation Bar, которые при нажатии будут делать либо push: либо pop: на местном NavigationController'e.
дык push-ить и pop-ить придётся в контроллере который обслуживает MainView.nib, а не тот .nib в котором логически должен быть прописан -
дык push-ить и pop-ить придётся в контроллере который обслуживает MainView.nib, а не тот .nib в котором логически должен быть прописан
Пушить и попить можно где угодно. В любом view controller'e то есть. Создал нужный view controller и вызвал [self.navigationController pushViewController:animated] (кажется так, я сейчас на работе — не могу проверить).
а зачем ей знать? пускай грузит nib и не волнуется за то, что будет проиходить в дочернем sub-view
видишь, если поставить в MainView.nib сразу UINavigationController, то сразу же будет рисоваться вверху табБар. А мне хочется, что бы он рисовался после(благодаря тому) что я загружу nib в котором он будет и в котором будет реализована его логика
То есть тебе нужно в TabBarController'e ставить тип UIViewController и не париться. Просто эппл предусмотрительно ввел несколько других опций, чтобы было немного проще. (И да, то, что сверху — это navigation bar. Tab bar — он снизу.) -
Т.е. то что нарисованно на "a.2" - это всё же своего рода типы "коннекторов" которые говорят - на первой закладке у нас будет просто View, на второй - navigation bar, а на третей - тоже просто view. т.е. полной абстракции tabBar-a от контента не получится?
если так, то что должно быть в загружаемом nib-e? непосредственно контент того, что будет отображаться через navagationBar? -
если так, то что должно быть в загружаемом nib-e? непосредственно контент того, что будет отображаться через navagationBar?
И все-таки давай определимся с понятиями :) Navigation Bar — та штука сверху, у которой есть левая и правая кнопки и заглавие. Она работает вкупе с NavigationController'ом и ей совершенно пофигу, что ты засунешь во view, в котором она сидит. То, что снизу — это Tab Bar. В него авторы встроили возможность указывать тип содержимого каждой страницы: всего лишь для удобства и простоты решения частой проблемы. Это совершенно не значит, что содержимое страницы должно что-то делать или чему-то соответствовать. Абстракция никуда не исчезает. Если сомневаешься, просто оставь значение по умолчанию (View Controller).
А в загружаемом nib'е должен быть интерфейс, который ты хочешь отобразить при переходе на соответствующую страницу. -
Окей :-)
Создаю новый проект TabBar application based. Добавлюя новый TabBarItem для которого говорю, чтобы грузился ThirdView.xib. Этот самый ThirdView.nib делаю из view based file.
В него я добавляю NavigationController, но его view не могу свзяать с Files Owner, а только с view который уже в нём сидит.
И соответстсвенно при загрузке этого nib-a я на экране вижу view который я могу связать с Files Owner, а не UINavigatorController.
Как мне заставить на экране появлятся на экране NavigatorController который лежит в стороннем nib-e?
на всякий случай, кода я никогого не писал :-) -
В него я добавляю NavigationController, но его view не могу свзяать с Files Owner, а только с view который уже в нём сидит.
Ну так так и должно быть.
Как мне заставить на экране появлятся на экране NavigatorController который лежит в стороннем nib-e?
NavigatorController не может появиться на экране — он контроллер. А вот его view может. Чего-то я твою проблему перестал видеть. Зазипуй свой проект, выложи где нибудь и скажи, что ты хочешь, чтобы появлялось и где. -
-
Потому что ты такого там нагородил, что я разобраться что к чему и зачем не могу :) Я конечно мог бы попытаться, но времени не хватает на все. Поэтому позволь подсказать тебе, как я бы поступил в твоей ситуации.
1) Категоризируй каждый свой экран (к примеру №1.1 и №2.1 — одно и то же, только заголовки разные)
2) Для каждой категории создай свой View (к примеру №1.1 и №2.1 ты правильно назвал CatalogView.nib)
3) Соответственно для каждого view напиши свой котроллер, который инициализируется с параметрами, уникальными для этого view (data source таблицы, заголовок и пр.)
4) Также в инициализации контроллеров создавай навигационные кнопки примерно таким путем:
self.navigationItem.leftBarButtonItem =
[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self
action:@selector(goBack:)] autorelease];
self.navigationItem.rightBarButtonItem =
[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave
target:self
action:@selector(blahblah:)] autorelease];
Если не укажешь leftBarButtonItem, то по умолчанию она будет кнопкой "Назад" с заголовком предыдущего view.
5) Когда нужно (в твоем случае при нажатии на ячейку таблицы) создавай соответствующий контроллер и вызывай
[self.navigationController pushViewController:controller animated:YES];
Дай знать, если все заработает (если не заработает, тоже дай знать). -
В проекте я всего лишь в MainView я сказал, чтобы грузились соответствующие NIB-ы :-)
а в этих самых нибах я добавил Navigation controller-ы, и их NavigationBar я "пределал" к File's owner - ам -
Нашёл туториал - который показывает как руками собрать TabBarController - http://miketeo.net/wp/index.php/2008/08/31/simple-iphone-tutorial-part-1.html
Но вот руками собрать в дочернем НИБ-е NavigatorController не получается.
Видимо придётся тип UIView TabItem указывать явно -
Нашёл туториал - который показывает как руками собрать TabBarController - http://miketeo.net/wp/index.php/2008/08/31/simple-iphone-tutorial-part-1.html
Но вот руками собрать в дочернем НИБ-е NavigatorController не получается.
Видимо придётся тип UIView TabItem указывать явно