1. iBeginner

    15.10.2020 17:41

    Привет!
    Наткнулся на сайт благодаря Хабре и айФону. по статьям и форумам понял, что тут собираются люди которые не первую неделю кодят для Кокоа. Поэтому кое как расчитываю на вашу помощь программисту, которому тяжело перестроится после 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
  2. iBeginner

    15.10.2020 17:53

    Сейчас опишу логику программы:

    №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 информацией о версии программы и т.п.
  3. Алексей Блинов

    16.10.2020 01:03

    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#! :)
  4. iBeginner

    16.10.2020 02:21

    Я вот что хотел сказать своими постами:

    у меня было(есть) желание, чтобы файл MainView.nib управлял (читай показывал) через UITabBarController другие 3 nib файла (CatalogView, FavView, InfoView). И при этом чтобы MainView.nib не волновало, что внутри них ( UIViewController, UITableViewControoler, а может в нибе ещ] один UITabBarController )

    Т.е. когда увидел надпись: Loaded From SecondView.nib мне отчего-то подумалось, что при таком раскладе UITabBarController-y( который снизу :-) ) будет пофигу что будет в загружаемых ниб-ах

    а оказывается нет?

  5. iBeginner

    16.10.2020 02:34

    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 в котором логически должен быть прописан

  6. Алексей Блинов

    16.10.2020 07:30

    дык 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 — он снизу.)
  7. iBeginner

    16.10.2020 11:45

    Т.е. то что нарисованно на "a.2" - это всё же своего рода типы "коннекторов" которые говорят - на первой закладке у нас будет просто View, на второй - navigation bar, а на третей - тоже просто view. т.е. полной абстракции tabBar-a от контента не получится?

    если так, то что должно быть в загружаемом nib-e? непосредственно контент того, что будет отображаться через navagationBar?

  8. Алексей Блинов

    16.10.2020 15:29

    если так, то что должно быть в загружаемом nib-e? непосредственно контент того, что будет отображаться через navagationBar?
    И все-таки давай определимся с понятиями :)  Navigation Bar — та штука сверху, у которой есть левая и правая кнопки и заглавие. Она работает вкупе с NavigationController'ом и ей совершенно пофигу, что ты засунешь во view, в котором она сидит. То, что снизу — это Tab Bar. В него авторы встроили возможность указывать тип содержимого каждой страницы: всего лишь для удобства и простоты решения частой проблемы. Это совершенно не значит, что содержимое страницы должно что-то делать или чему-то соответствовать. Абстракция никуда не исчезает. Если сомневаешься, просто оставь значение по умолчанию (View Controller).

    А в загружаемом nib'е должен быть интерфейс, который ты хочешь отобразить при переходе на соответствующую страницу.
  9. iBeginner

    16.10.2020 21:26

    Окей :-)
    Создаю новый проект 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?

    на всякий случай, кода я никогого не писал :-)
  10. Алексей Блинов

    17.10.2020 00:57

    В него я добавляю NavigationController, но его view не могу свзяать с Files Owner, а только с view который уже в нём сидит.

    Ну так так и должно быть.

    Как мне заставить на экране появлятся на экране NavigatorController который лежит в стороннем nib-e?

    NavigatorController не может появиться на экране — он контроллер. А вот его view может. Чего-то я твою проблему перестал видеть. Зазипуй свой проект, выложи где нибудь и скажи, что ты хочешь, чтобы появлялось и где.
  11. iBeginner

    17.10.2020 11:21

    http://ifolder.ru/8608903

    тут проект.
    почему-то не загружаются nib ы который я прописал в tabBar-e
  12. Алексей Блинов

    17.10.2020 15:48

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

    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];



    Дай знать, если все заработает (если не заработает, тоже дай знать).
  13. iBeginner

    18.10.2020 00:39

    В проекте я всего лишь в MainView я сказал, чтобы грузились соответствующие NIB-ы :-)
    а в этих самых нибах я добавил Navigation controller-ы, и их NavigationBar я "пределал" к File's owner - ам
  14. iBeginner

    18.10.2020 17:51

    Нашёл туториал - который показывает как руками собрать TabBarController - http://miketeo.net/wp/index.php/2008/08/31/simple-iphone-tutorial-part-1.html


    Но вот руками собрать в дочернем НИБ-е NavigatorController не получается.
    Видимо придётся тип UIView TabItem указывать явно
  15. iBeginner

    18.10.2020 17:51

    Нашёл туториал - который показывает как руками собрать TabBarController - http://miketeo.net/wp/index.php/2008/08/31/simple-iphone-tutorial-part-1.html


    Но вот руками собрать в дочернем НИБ-е NavigatorController не получается.
    Видимо придётся тип UIView TabItem указывать явно
Страницы
(1)

bbcode

.