2010-11-26 32 views
0

Je suis maintenant en utilisant ce code:En utilisant la TTLauncherView de Three20: Besoin d'aide avec le fractionnement et l'ajout d'autres objets à partir d'un NSMutableArray à un NSArray en Objective-C

- (void)loadLauncher:(NSMutableArray *)categoriesArray { 
    _launcherView = [[TTLauncherView alloc] initWithFrame:self.view.bounds]; 
    _launcherView.columnCount = 3; 

    // Number of pages in your launcherView. 
    NSMutableArray *pages = [[NSMutableArray alloc] initWithCapacity:2]; 

    int numberOfObjects = [categoriesArray count]; 

    // The launcherItems in each page, calculate automatically the number of objects available for the launcher. 
    NSMutableArray *launcherItems = [[NSMutableArray alloc] initWithCapacity:1]; 

    // The counter to identify if the number of objects exceeds the, 
    // capacity of a launcher page of 9. 
    int j = 1; 

    for (int i = 0; i < numberOfObjects; i++){ 
     if (j > 9){ 
      // Add the current launcherItems array to the pages. 
      [pages addObject:launcherItems]; 

      // Initialise new launcher items. 
      launcherItems = [[NSMutableArray alloc] initWithCapacity:1]; 

      // Start the counter again. 
      j = 1; 
     } else { 
      int i = 0; 
      for (Category *c in categoriesArray) { 
       NSString *categoryImage = [[NSString stringWithFormat:@"bundle://category_%@_icon.png", [Utility removeSpecialCharacters:@"&'- " withString:c.categoryName]] lowercaseString]; 
       NSLog(@" - %@", categoryImage); 
       TTLauncherItem *launcherItem = [[[TTLauncherItem alloc] initWithTitle:c.categoryName 
                       image:categoryImage 
                        URL:[NSString stringWithFormat:@"%d", i] 
                      canDelete:NO] autorelease]; 

       [launcherItems addObject:launcherItem];   

       i++; 
      } 
     } 

     j++; 
    } 

    // Add the current launcherItems to the pages. 
    [pages addObject:launcherItems]; 
    [launcherItems release]; 

    _launcherView.pages = pages; 

    [self.view addSubview:_launcherView]; 
} 

méthode ancienne:

J'utilise le Contrôleur TTLauncherView de http://three20.info. Three20 est une collection de classes Objective-C qui alimente un nombre croissant d'applications populaires sur App Store. Il fournit des dizaines de fonctionnalités incroyablement utiles qui vous font gagner du temps de développement.

La bibliothèque est conçue pour être modulaire, ce qui signifie que vous pouvez incorporer sélectivement des éléments de la bibliothèque dans votre projet. Il existe également un nombre croissant d'extensions, y compris l'analyse XML et JSON drop-in, ainsi que la prise en charge de la feuille de style CSS pour le traitement de vos applications.

Je ne suis pas tout à fait sûr de savoir comment effectuer les opérations suivantes:

  1. Vérifiez si mon arrayOfLauncherItems a 16 objets qu'il contient; et
  2. S'il y a plus de 16 objets, ajoutez le reste des objets restants à _launcherView.pages. Donc, disons qu'il y a un total de 32 objets que je voudrais pouvoir créer un autre tableau des 16 objets restants et les ajouter au _launcherView.pagesNSArray.

Ceci est un exemple de la façon dont le contrôleur TTLauncherView fonctionne: ce qui signifie que les TTLauncherItem objets restants doivent être sur la deuxième page et ainsi de suite

TTLauncherView *_launcherView = [[TTLauncherView alloc] initWithFrame:self.view.bounds]; 

NSMutableArray *arrayOfLauncherItems = [[NSMutableArray alloc] init]; 
//add TTLauncherItem objects to arrayOfLauncherItems. 

_launcherView.pages = [NSArray arrayWithObjects:arrayOfLauncherItems, nil]; 

Le arrayOfLauncherItems peut contenir plus de 16 objets, (en fonction du nombre total d'objets présents). Faire ce qui suit ajoute évidemment les mêmes 16 objets de arrayOfLauncherItems, ce qui signifie qu'il y a maintenant une deuxième page, ce qui est essentiellement ce que je veux atteindre s'il y a plus de 32 objets dans arrayOfLauncherItems.

_launcherView.pages = [NSArray arrayWithObjects:arrayOfLauncherItems, arrayOfLauncherItems, nil]; 

Répondre

1

J'ai le code suivant que vous souhaitez utiliser. L'idée de base est de calculer automatiquement le nombre de pages en fonction du nombre d'objets disponibles. Je suppose que vous avez 3x3 = 9 éléments lanceur dans chaque page. De cette façon, vous n'avez pas à vous soucier du nombre total d'objets inférieur ou supérieur à 9. Vous pouvez mettre cette valeur dans une constante si vous le souhaitez.

NSMutableArray *pages = [NSMutableArray array]; 
NSMutableArray *launcherItems = [NSMutableArray array]; 

//the counter to identify if the number of objects exceeds the 
//capacity of a launcher page of 9 
int j = 1; 
for (int i = 0; i < numberOfObjects; i++){ 

    TTLauncherItem *launcherItem = [[[TTLauncherItem alloc] initWithTitle: @"a title" 
                    image: @"bundle://abc.png" 
                     URL: @"someUrlPath" 
                   canDelete:TRUE] autorelease]; 
    [launcherItems addObject:launcherItem];   

    j++; 

    if (j> 9){ 
     //add the current launcherItems to the pages 
     [pages addObject:launcherItems]; 

     //initialize new launcher items 
     launcherItems = [NSMutableArray array]; 
     //start again the counter 
     j = 1; 
    }  
} 
//add the current launcherItems to the pages 
[pages addObject:launcherItems]; 

_launcherView.pages = pages; 
+0

J'ai mis à jour ma question initiale et utilisé votre code. Mais je ne reçois pas les mêmes éléments sur les deux pages. Définissant initWithCapacity sur 2 pour le nombre de pages. Comment puis-je contrôler cela s'il y a plus de pages que deux pour le nombre total d'éléments? – fuzz

+0

Pouvez-vous m'aider avec ce bug? J'utilise votre code mais j'utilise maintenant un columnCount de 3, ce qui me donne un total de 9 catégories par page. Le problème est que le 10ème article ne s'affiche pas. Il ignore simplement le 10ème élément et passe à la page 2, mais il commence à partir de l'élément de la 11ème catégorie. Pourriez-vous me donner un coup de main avec ça? – fuzz

+0

Salut Fulvio, désolé pour le retard, je n'étais pas au courant de votre commentaire. S'il vous plaît voir le code mis à jour si cela fonctionne. –

1

1) Vous utilisez [myArray count] pour obtenir le nombre d'éléments dans un tableau.

2) utiliser une boucle:

NSMutableArray *overflow = [NSMutableArray array]; 
NSMutableArray *sixteen = [NSMutableArray array]; 
for (int i = 16; i < [arrayOfLauncherItems count]; i++) 
{ 
    [overflow addObject:[arrayOfLauncherItems objectAtIndex:i]]; 
} 
for (int i = 0; i < 16; i++) 
{ 
    [sixteen addObject:[arrayOfLauncherItems objectAtIndex:i]]; 
} 

_launcherView.pages = [NSArray arrayWithObjects:sixteen, overflow, nil]; 

La première boucle ajoute les objets à partir de l'index 16 jusqu'à ce que l'extrémité du réseau et les ajouter à un autre tableau. La seconde se termine par un tableau des 16 premiers éléments du tableau original.

+0

Le code ci-dessus ne fonctionne pas comme je le souhaite. En fait, il y a beaucoup plus de choses que ce qu'il devrait être. En fait, il affiche plus de 16 pages, mais il en affiche également sur la deuxième page.Peut-être que je ne l'applique pas correctement. Je vérifie IF arrayOfLauncherItems est supérieur à 16 et en utilisant votre code ELSE juste faire _launcherView.pages = [NSArray arrayWithObjects: arrayOfLauncherItems, nil]; – fuzz

+0

Je pense que je comprends ce que vous essayez de faire. Voir mon exemple de code édité. –

+0

Je pense que vous avez oublié de remplacer un couple de tableaux là-bas. Je ne suis pas tout à fait sûr de ce que myArray et arrayOfLauncherItems est maintenant. Sont-ils censés être les mêmes? De plus, vous ne faites rien avec un débordement. – fuzz