На OS X, разделяя GUI на несколько файлов NIB и подклассов NSView - PullRequest
3 голосов
/ 23 января 2009

Я занимаюсь разработкой приложения для OS X / Cocoa и хочу, чтобы поведение было таким:

  • Существует боковая панель с различными параметрами, скажем, «Вариант A», «Вариант B» и «Вариант C».
  • Когда вы нажимаете A, B или C, он загружает соответствующий графический интерфейс на главную панель. Каждый GUI - это отдельный подкласс NSView, и он определен в отдельном файле NIB / XIB. Например, опция A может содержать 3 кнопки и может быть экземпляром NSViewSubclassA, а опция B может иметь 1 кнопку и текстовое поле и быть экземпляром NSViewSubclassB.

Как бы я занялся программированием этого?

1 Ответ

7 голосов
/ 23 января 2009

Начните с создания подкласса NSViewController, чтобы у каждого из ваших подпредставлений был контроллер. В вашем методе действия, когда пользователь нажимает кнопку для переключения между представлениями, вы можете создать новый контроллер представления с соответствующим классом и nib (сохраните ссылку на него в ivar в контроллере окна). Контроллер представления действует как владелец пера. Затем все, что вам нужно сделать, это добавить представление контроллера представления в качестве подпредставления в главном окне, и все готово.

Вот быстрый пример. Это вызывается в главном окне контроллера из метода действия (и после запуска) после выполнения нескольких не связанных задач; единственная сложная часть - это исправление цепочки респондента (если вам повезет, вам может не понадобиться это делать).

- (void)_setAccessoryViewControllerFromTag:(NSInteger)tag;
{
    if ( _accessoryContentViewController != nil )
    {
        [self setNextResponder:[_accessoryContentViewController nextResponder]];
        [_accessoryContentViewController release];
    }

    switch ( tag )
    {
        case 0:
            _accessoryContentViewController = [[RLGraphsViewController alloc] initWithNibName:@"GraphsView" bundle:nil];
            break;
        case 1:
            _accessoryContentViewController = [[RLSummaryViewController alloc] initWithNibName:@"SummaryView" bundle:nil];
            break;
        case 2:
            _accessoryContentViewController = [[RLEquipmentViewController alloc] initWithNibName:@"EquipmentView" bundle:nil];
            break;
        default:
            _accessoryContentViewController = [[RLLocationsViewController alloc] initWithNibName:@"LocationsView" bundle:nil];
            break;
    }

    [_accessoryContentViewController setNextResponder:[self nextResponder]];
    [self setNextResponder:_accessoryContentViewController];        
    [self.accessoryView setContentView:[_accessoryContentViewController view]];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...