Использование TTLauncherView от Three20: нужна помощь с разбиением и добавлением оставшихся объектов из NSMutableArray в NSArray в Objective-C - PullRequest
0 голосов
/ 26 ноября 2010

Я сейчас использую этот код:

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

Старый метод:

Я использую контроллер TTLauncherView из http://three20.info.

Three20 - это коллекцияклассов Objective-C, которые поддерживают растущее число популярных приложений в App Store.Он предоставляет десятки невероятно полезных функций, которые экономят ваше время разработки.

Библиотека построена так, чтобы быть модульной, что означает, что вы можете выборочно включать элементы библиотеки в ваш проект.Существует также растущий набор расширений, в том числе встроенный синтаксический анализ XML и JSON, а также поддержка таблиц стилей CSS для создания тем для ваших приложений.

Я не совсем уверен, как сделать следующее:

  1. Проверьте, есть ли в моем arrayOfLauncherItems 16 объектов;и
  2. Если существует более 16 объектов, добавьте оставшиеся объекты к _launcherView.pages.Итак, если, скажем, есть всего 32 объекта, я бы хотел иметь возможность создать еще один массив из оставшихся 16 объектов и добавить их в _launcherView.pages NSArray.

Этопример работы контроллера TTLauncherView:

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

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

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

arrayOfLauncherItems может содержать более 16 объектов, что означает, что остальные объекты TTLauncherItem должны находиться на второй странице и т. д. (в зависимости ото том, сколько всего объектов).

Выполнение следующего, очевидно, добавляет те же 16 объектов из arrayOfLauncherItems, что означает, что теперь есть вторая страница, что, по сути, я хочу достичь, если есть больше, чем32 объекта в arrayOfLauncherItems.

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

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

У меня есть следующий код, который вы можете использовать. Основная идея заключается в том, чтобы автоматически рассчитывать количество страниц на основе количества доступных объектов. Я предполагаю, что у вас есть 3x3 = 9 элементов запуска на каждой странице. Таким образом, вам не нужно беспокоиться об общем количестве объектов меньше или больше 9. Вы можете поместить это значение в константу, если хотите.

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;
1 голос
/ 26 ноября 2010

1) Вы используете [myArray count], чтобы получить количество элементов в массиве.

2) Используйте цикл for:

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

Первый цикл for будет добавлять объектыот индекса 16 до конца массива и добавьте их в другой массив.Второй заканчивается массивом из первых 16 элементов исходного массива.

...