关于iOS App的复杂设计问题

时间:2011-08-23 02:52:15

标签: iphone ios cocoa-touch design-patterns uiview

所以我对一个我正在为iPhone开发的应用程序有一个有趣的设计问题。我正在创建一个操纵图像的应用程序,并且可以执行不同类型的操作。因此,用户打开应用程序,并选择他们想要执行的操作类型,并通过一步一步的过程来执行操作。

很多操作都很相似,所以代码可以在这里重用。因此,我决定创建一个视图和一个视图控制器,而不是为每个操作的每个窗口创建一个视图控制器。视图包含每个图像操作的步骤,每次增加到下一步时,它都会适当地重新组织。视图控制器由导航控制器控制,每次用户前进到他们尝试执行的任何图像操作的下一步(即在堆栈上推送新的视图控制器)时,我制作了我的视图对象的副本,将其设置为将其组件重新组织到适当的步骤,然后将其发送到将显示它的新视图控制器。

所以我的问题是,对于操作的某些阶段,我需要将一些按钮添加到附加到视图控制器的通用工具栏上(因为这是一个模态视图,这个工具栏将有一个主页按钮,使用户能够退回到主屏幕)。基本上,我对如何处理这个问题有几个问题:

1)我应该只将工具栏添加到我正在使用的视图中,而不是视图控制器。如果是这样,我如何让工具栏上的主页按钮退出模态视图?

2)我应该将工具栏保留在视图控制器上,并在视图加载时让我的视图返回一组要添加到其中的按钮吗?然后我想我必须在视图控制器中列出我的所有动作方法?

3)我应该将工具栏保留在视图控制器上,还是将工具栏中的指针发送到我的视图对象,然后在视图类中添加按钮?我可以在我的视图类中添加我的动作方法吗?

无论如何,对不起,如果这很复杂,如果您有任何跟进问题,请告诉我。

2 个答案:

答案 0 :(得分:0)

1)好的。

对于解雇,您的视图是否有指向视图控制器的指针?这样的事情怎么样:

[self.viewController.parentViewController dismissModalViewControllerAnimated:YES];

不确定我是否完全了解您的层次结构的组织方式。这只是我的猜测。

2)这对我来说似乎很愚蠢。您必须定义某种数据结构,该结构描述视图在按钮中的内容,并列出它们的列表。视图控制器必须请求该列表,然后通过它们。

3)这似乎是最好的选择。但我不会让您的视图直接将子视图添加到工具栏。创建ToolbarView自定义视图。给它一些addButton方法,其参数描述了你想要按钮的基本属性,比如标题,目标和动作。让ToolbarView决定它的外观,位置等等。

您的操作方法可以继续使用您的视图类吗?是的,我想,但他们不应该。推荐的iPhone设计模式是视图不应该任何东西,它们应该只显示东西。执行操作的方法应该在视图控制器上,即使他们做的唯一事情是更改正在显示的视图。

答案 1 :(得分:0)

我终于想出了一个解决方案。我所做的是创建一个名为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];
}

因此,对于我的应用程序,在每个viewcontroller上它将在底部有一个工具栏,其中包含用于创建图片,访问帐户或访问帮助的基本按钮。如果访问其中一个按钮,它将启动一个模态视图,该视图将具有退出模态视图的主页按钮(当创建UIMainViewController时,其中一个参数告诉它它在哪个模式,因此哪个工具栏按钮到添加。

但主要的是我创建了一个类mutablearray varialbe来存储工具栏按钮,然后按钮在“assembleToolbarButtons”中创建。现在,任何继承自UIMainViewController的类都可以覆盖assembleToolbarButtons,以便在已经添加的主要按钮之上添加它自己的按钮。

至于我最初提到的使用一个UIView并让它重新组织,并且只有一个uiviewcontroller,我避免了这个,而是为每个步骤和单独的视图创建单独的视图控制器,以便更多地遵守MVC。 / p>