Subviews исчезают по завершении awakeFromNib - PullRequest
0 голосов
/ 01 марта 2011

У меня есть представление с подпредставлением NSBox (с CA, включенным для тени), и я пытаюсь динамически добавить свой подкласс NSView в блок во время awakeFromNib.

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

Проблема в том, что после завершения метода awakeFromNib подпредставления внезапно исчезают! Я поместил множество утверждений NSLog, чтобы попытаться отследить его, и все, что я обнаружил, это то, что подпредставления явно добавляются в NSBox, прежде чем они исчезнут. При запуске приложения подпредставления появляются ненадолго, а затем исчезают после завершения анимации.

Вот мой метод awakeFromNib:

-(void)awakeFromNib
{
    //Fill an array with buttons for each company object
    buttons = [[NSMutableArray alloc] init];
    for (BCCompany *c in [[[BCParser sharedParser] managedObjectContext]     fetchObjectsForEntityName:@"BCCompany" withPredicate:nil andSortDescriptor:nil])
    {
        CompanyButton *button = [[CompanyButton alloc] initWithFrame:NSMakeRect(0, 0, 150,     150)];
        [button setCompanyName:[c name]];
        [buttons addObject:button];
    }

    //Determine how many columns we can fit across the window -- 100px padding on each side --     150px width for each button
    int noOfColumns = ([[self view] frame].size.width - 200) / 150;
    if ([buttons count] < noOfColumns)
        noOfColumns = [buttons count];

    //Determine how many rows will be needed
    int noOfRows = ([buttons count] + noOfColumns - 1) / noOfColumns;

    //Resize and reposition the box
    [whiteBox setFrameSize:NSMakeSize((noOfColumns * 150) + 60, (noOfRows * 150) + 20)];
    [whiteBox setFrameOrigin:NSMakePoint(NSMidX([[self view] frame]) - ([whiteBox     frame].size.width/2), NSMidY([[self view] frame]) - ([whiteBox frame].size.height/2) - 100)];


    //Now iterate through each row and add items, checking if it's the last row
    subviewsToAdd = [[NSMutableArray alloc] init];
    for (int i=0; i<noOfRows; i++)
    {
        NSRect boxRect = [whiteBox frame];
        NSArray *tempArray = [[NSArray alloc] init];

        if (i == (noOfRows-1)) {
            //Final row
            tempArray = [buttons subarrayWithRange:NSMakeRange(i*noOfColumns, [buttons     count])];
            for (int j=0; j<[tempArray count]; j++)
            {
                //Iterate through the remaining buttons and add them
                NSPoint buttonOrigin = NSMakePoint(5 + (j * 150),     (boxRect.size.height) - (150 * (i+1)));
                NSRect buttonRect = NSMakeRect(buttonOrigin.x, buttonOrigin.y,     150, 150);
                [[tempArray objectAtIndex:j] setFrame:buttonRect];
                NSLog(@"%@ Frame -- X:%f   Y:%f  --  j:%i", [[tempArray     objectAtIndex:j] companyName], [[tempArray objectAtIndex:j] frame].origin.x, [[tempArray     objectAtIndex:j] frame].origin.y, j);
                [subviewsToAdd addObject:[tempArray objectAtIndex:j]];
            }
        } else {
            //Not the final row
            tempArray = [buttons subarrayWithRange:NSMakeRange(i*noOfColumns,     noOfColumns)];
            for (int j=0; j<noOfColumns; j++)
            {
                //Position each one on this row
                NSPoint buttonOrigin = NSMakePoint(5 + (j * 150),     (boxRect.size.height) - (150 * (i+1)) - 10);
                NSRect buttonRect = NSMakeRect(buttonOrigin.x, buttonOrigin.y, 150,     150);
                [[tempArray objectAtIndex:j] setFrame:buttonRect];
                [subviewsToAdd addObject:[tempArray objectAtIndex:j]];
            }
        }
    }
    [whiteBox setSubviews:subviewsToAdd];
    [whiteBox setNeedsDisplay:YES];
}

Любая помощь по этому вопросу будет принята с благодарностью!

Steve

1 Ответ

0 голосов
/ 01 марта 2011

В документации для NSView -setSubviews:

Этот метод отмечает затронутые области просмотра и окна как требующие отображения.если вы не позвоните -setNeedsDisplay снова на whiteBox?

...