Сложный вопрос о дизайне приложения iOS - PullRequest
2 голосов
/ 23 августа 2011

Итак, у меня есть интересный вопрос о дизайне приложения, которое я разрабатываю для iPhone.Я создаю приложение, которое манипулирует изображениями, и существуют различные типы манипуляций, которые могут быть выполнены.Таким образом, пользователь открывает приложение и выбирает, какой тип манипуляции он хочет выполнить, и проходит пошаговый процесс для выполнения манипуляции.

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

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

1) Должен ли я просто добавить панель инструментов к используемому представлению вместо контроллера представления.Если это так, как бы у меня была кнопка «Домой» на панели инструментов для выхода из модального вида?

2) Должен ли я держать панель инструментов на контроллере вида, и чтобы мой вид возвращал набор кнопок, которые необходимо добавить к нему?когда вид загружается?Тогда, я думаю, мне нужно было бы перечислить все мои методы действия в моем контроллере представления?

3) Должен ли я сохранить панель инструментов на контроллере представления, но отправить указатель с панели инструментов на мой объект представления, а затем добавитькнопки в моем классе просмотра?Смогу ли я добавить свои методы действия в свой класс просмотра?

В любом случае, извините, если это сложно, и если у вас есть какие-либо дополнительные вопросы, пожалуйста, дайте мне знать.

Ответы [ 2 ]

0 голосов
/ 29 октября 2011

Я наконец-то нашел решение для этого.Я создал универсальный контроллер вида UIMainViewController, который явно наследуется от UIViewController.Я реализую панель инструментов следующим образом:

    - (void) viewDidLoad 
    {
        [super viewDidLoad];

        [self assembleToolbarButtons];
        [[self navigationController] setToolbarHidden:NO]; 
        [self setToolbarItems: toolbarButtons];
        [[[self navigationController] toolbar]setBarStyle:UIBarStyleBlack];
    }

    - (void) assembleToolbarButtons
    {
        NSMutableArray *toolbarButtonsTemp = [[NSMutableArray alloc] init];
        [self setToolbarButtons: toolbarButtonsTemp];
        [toolbarButtonsTemp release];

        if ([self mode] == UIMainViewControllerMainMode)
        {
            UIBarButtonItem *createAPictureButton = [[UIBarButtonItem alloc] initWithTitle:@"Create" style: UIBarButtonItemStyleBordered target:self action:@selector(loadCreateAPictureModalViewController)];
            UIBarButtonItem *accountButton = [[UIBarButtonItem alloc] initWithTitle:@"Account" style: UIBarButtonItemStyleBordered target:self action:@selector(loadAccountModalViewController)]; 
            UIBarButtonItem *helpButton = [[UIBarButtonItem alloc] initWithTitle:@"Help" style: UIBarButtonItemStyleBordered target:self action:@selector(loadHelpModalViewController)]; 

            [[self toolbarButtons] addObject: createAPictureButton];
            [[self toolbarButtons] addObject: accountButton];
            [[self toolbarButtons] addObject: helpButton];

            [createACaptionButton release]; 
            [accountButton release];
            [helpButton release];
        }
        else 
        {
            UIBarButtonItem *homeButton = [[UIBarButtonItem alloc] initWithTitle:@"Home" style: UIBarButtonItemStyleBordered target:self action:@selector(exitModalViewController)]; 

            [[self toolbarButtons] addObject: homeButton];

            [homeButton release];
        }


    }

-(void) loadCreateAPictureModalViewController
{   
    CreateAPictureViewController *createAPictureViewController = [[CreateAPictureViewController alloc] initWithMode:UIMainTableViewControllerModeModal];
    UINavigationController *createAPictureNavController = [[UINavigationController alloc] initWithRootViewController: createAPictureViewController];

    [[createAPictureNavController navigationBar] setBarStyle:UIBarStyleBlack];
    [self presentModalViewController:createAPictureNavController animated:YES];

    [createAPictureNavController release];
    [createAPictureViewController release]; 
}

-(void) loadAccountModalViewController
{
    AccountViewController *accountViewController = [[AccountViewController alloc] initWithMode:UICaptionDistractionTableViewControllerModeModal];
    UINavigationController *accountNavController = [[UINavigationController alloc] initWithRootViewController: accountViewController];

    [[accountNavController navigationBar] setBarStyle:UIBarStyleBlack];
    [self presentModalViewController: accountNavController animated:YES];

    [accountNavController release];
    [accountViewController release];
}

-(void) loadHelpModalViewController
{
    HelpViewController *helpViewController = [[HelpViewController alloc] initWithMode:UICaptionDistractionTableViewControllerModeModal];
    UINavigationController *helpNavController = [[UINavigationController alloc] initWithRootViewController: helpViewController];

    [[helpNavController navigationBar] setBarStyle:UIBarStyleBlack];
    [self presentModalViewController: helpNavController animated:YES];

    [helpNavController release];
    [helpViewController release];
}

-(void) exitModalViewController
{
    [self dismissModalViewControllerAnimated:YES];
}

Так что для моего приложения на каждом контроллере представления внизу будет панель инструментов с основными кнопками для создания изображения, доступа к учетной записи или доступа к справке.При обращении к одной из этих кнопок будет запущено модальное представление, в котором будет кнопка «Домой» для выхода из модального представления (когда создается UIMainViewController, один из его параметров сообщает ему, в каком режиме он находится, и, следовательно, какие кнопки панели инструментов должныadd.

Но главное, что я создал класс mutablearray varialbe для хранения кнопок панели инструментов, а затем кнопки создаются в "assemblyToolbarButtons". Теперь любой класс, который наследуется от UIMainViewController, может переопределить buildToolbarButtons для добавленияэто собственные кнопки поверх основных, которые уже были добавлены.

Что касается того, что я упомянул изначально при использовании одного UIView и его реорганизации, и только одного контроллера uiview, я избежал этого и вместо этого просто создалотдельные контроллеры представления для каждого шага и отдельные представления, чтобы придерживаться MVC больше.

0 голосов
/ 23 августа 2011

1) Ок.

Для отклонения, есть ли в вашем представлении указатель на контроллер представления?Как насчет чего-то вроде этого:

[self.viewController.parentViewController dismissModalViewControllerAnimated:YES];

Не уверен, правильно ли я понимаю, как организована ваша иерархия.Это только мое предположение.

2) Мне это кажется глупым.Вам нужно будет определить какую-то структуру данных, которая описывает то, что нужно представлению для кнопки, составить их список.Контроллер представления должен запросить этот список, просмотреть их.

3) Это кажется лучшим вариантом.Но я бы не стал, чтобы ваше мнение напрямую добавляло подпредставления на панель инструментов.Создайте пользовательский вид панели инструментов.Дайте ему какой-нибудь метод addButton с параметрами, которые описывают, какие основные атрибуты вы хотите иметь для кнопки, например, заголовок, цель и действие.Пусть ToolbarView решает, как он выглядит, где он расположен и т. Д.

Могут ли ваши методы действия перейти на класс представления?Да, я думаю, но они не должны.Рекомендуемый шаблон дизайна iPhone состоит в том, что представления не должны ничего делать, они должны просто показывать вещи.Методы, которые делают что-то, должны быть на контроллерах представлений, даже если единственное, что они делают, это изменяют отображаемые представления.

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