2 votes

Question de conception compliquée concernant une application iOS

J'ai une question de conception intéressante concernant une application que je développe pour l'iPhone. Je suis en train de créer une application qui manipule des images, et il y a différents types de manipulations qui peuvent être effectuées. L'utilisateur ouvre l'application, sélectionne le type de manipulation qu'il souhaite effectuer et suit un processus pas à pas pour effectuer la manipulation.

Beaucoup de manipulations sont similaires, donc le code peut être réutilisé ici. Ainsi, au lieu de créer un contrôleur de vue pour chaque fenêtre de chaque manipulation, j'ai décidé de créer une vue et un contrôleur de vue. La vue contient les étapes de chaque manipulation d'image, et chaque fois qu'elle est incrémentée à l'étape suivante, elle se réorganise de manière appropriée. Le contrôleur de vue est contrôlé par un contrôleur de navigation, et chaque fois que l'utilisateur passe à l'étape suivante de la manipulation d'image qu'il essaie d'effectuer (c'est-à-dire qu'il pousse un nouveau contrôleur de vue sur la pile), je fais une copie de mon objet de vue, je le configure pour réorganiser ses composants à l'étape appropriée, puis je l'envoie au nouveau contrôleur de vue qui l'affichera.

Ma question est donc la suivante : pour certaines étapes des manipulations, j'ai besoin d'ajouter des boutons à une barre d'outils universelle qui est attachée au contrôleur de vue (comme il s'agit d'une vue modale, cette barre d'outils aura un bouton d'accueil qui permettra à l'utilisateur de revenir à l'écran principal). En fait, j'ai quelques questions sur la façon dont je dois aborder ce problème :

1) Dois-je simplement ajouter la barre d'outils à la vue que j'utilise, au lieu du contrôleur de vue. Dans ce cas, comment faire en sorte que le bouton d'accueil de la barre d'outils permette de quitter la vue modale ?

2) Dois-je conserver la barre d'outils dans le contrôleur de vue et faire en sorte que ma vue renvoie un ensemble de boutons à ajouter lorsque la vue se charge ? Je suppose alors que je devrais lister toutes mes méthodes d'action dans mon contrôleur de vue ?

3) Dois-je conserver la barre d'outils dans le contrôleur de vue, mais envoyer un pointeur de la barre d'outils vers mon objet de vue, puis ajouter les boutons dans ma classe de vue ? Serais-je alors en mesure d'ajouter mes méthodes d'action dans ma classe de vue ?

Quoi qu'il en soit, désolé si c'est compliqué, et si vous avez des questions complémentaires, n'hésitez pas à m'en faire part.

0voto

morningstar Points 4845

1) Ok.

Pour le renvoi, votre vue a-t-elle un pointeur vers le contrôleur de vue ? Que diriez-vous de quelque chose comme ceci :

[self.viewController.parentViewController dismissModalViewControllerAnimated:YES];

Je ne suis pas sûr de comprendre exactement comment votre hiérarchie est organisée. C'est juste mon avis.

2) Cela me semble bizarre. Il faudrait définir une sorte de structure de données qui décrit ce que la vue veut dans un bouton, en faire une liste. Le contrôleur de vue doit demander cette liste et la parcourir.

3) Cela semble être la meilleure option. Mais je ne voudrais pas que votre vue ajoute directement des sous-vues à la barre d'outils. Créez une vue personnalisée ToolbarView. Donnez-lui une sorte de méthode addButton, avec des paramètres qui décrivent les attributs essentiels que vous voulez que le bouton ait, comme le titre, la cible et l'action peut-être. Laissez la ToolbarView décider de son apparence, de son positionnement, etc.

Vos méthodes d'action peuvent-elles aller sur votre classe de vue ? Oui, je suppose, mais elles ne devraient pas. Le modèle de conception recommandé pour l'iPhone est que les vues ne doivent pas faire n'importe quoi, ils devraient juste montrer des choses. Les méthodes qui font des choses devraient se trouver dans les contrôleurs de vues, même si la seule chose qu'elles font est de changer les vues affichées.

0voto

CoDEFRo Points 2147

J'ai finalement trouvé une solution à ce problème. J'ai créé un contrôleur de vue universel appelé UIMainViewController qui hérite évidemment de UIViewController. J'ai implémenté la barre d'outils comme suit :

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

Ainsi, pour mon application, sur chaque contrôleur de vue, il y aura une barre d'outils en bas qui aura les boutons de base pour créer une image, accéder au compte, ou accéder à l'aide. Si l'on accède à l'un de ces boutons, cela lancera une vue modale qui aura le bouton home pour quitter la vue modale (lorsque le UIMainViewController est créé, l'un de ses paramètres lui indique dans quel mode il se trouve, et donc quels boutons de barre d'outils ajouter.

Mais la chose principale est que j'ai créé une classe mutablearray varialbe pour stocker les boutons de la barre d'outils et ensuite les boutons sont créés dans "assembleToolbarButtons". Maintenant, toute classe qui hérite de UIMainViewController peut surcharger l'assembleToolbarButtons afin d'ajouter ses propres boutons en plus des principaux qui ont déjà été ajoutés.

Pour ce qui est de ce que j'ai mentionné au départ, à savoir l'utilisation d'une UIView et le fait qu'elle se réorganise elle-même, et d'un seul uiviewcontroller, j'ai évité cela et j'ai plutôt créé des contrôleurs de vue séparés pour chaque étape et des vues séparées afin d'adhérer davantage à MVC.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X