Многоразовые биты интерфейса, разработанные в IB - PullRequest
1 голос
/ 23 февраля 2010

Я создаю приложение, которое включает в себя одну и ту же группу кнопок в разных контекстах. Кнопки отправляют свои действия различным объектам в каждом контексте. Я хотел бы иметь возможность спроектировать один NSView в IB, содержащий кнопки, и затем иметь возможность размещать копии этого вида во многих местах моих перьев, сохраняя при этом связь, поэтому изменения распространяются. Я хотел бы подключить каждый из этих экземпляров к различным объектам, и чтобы кнопки отправляли свои действия любому объекту, к которому подключен их родительский вид.

Я думал о создании подкласса NSView, который при загрузке заменяет себя другим представлением, загружаемым из файла пера, устанавливая связанный объект в качестве владельца файла, но я не уверен, что это самый чистый метод. Вот моя реализация этой идеи (которая работает):

@implementation AVNViewFromNib

- (void)awakeFromNib
{
    //Load the nib whose name is specified by the "nibFile" key
    NSNib* viewNib = [[NSNib alloc] initWithNibNamed:[self valueForKey:@"nibFile"] bundle:[NSBundle mainBundle]];
    NSMutableArray* topLevelObjects = [NSMutableArray new];
    [viewNib instantiateNibWithOwner:relatedObject topLevelObjects:&topLevelObjects];

    //Find our replacement view in that nib
    for (id currentObject in topLevelObjects)
    {
        if ([currentObject isKindOfClass:NSClassFromString(@"AVNReplacementView")])
        {
            representedView = currentObject;
            break;
        }
    }

    //Copy appropriate properties from us to our representedView
    [representedView setAutoresizingMask:[self autoresizingMask]];
    [representedView setFrame:[self frame]];
    [[self superview] addSubview:representedView];

    //We were never here. :)
    [self removeFromSuperview];
    [viewNib autorelease];
}

@end

@implementation AVNReplacementView
@end

Это самый чистый метод? Есть ли стандартный способ сделать это?

1 Ответ

1 голос
/ 23 февраля 2010

Вы можете создать представление с помощью кнопок в IB, затем перетащить это представление в окно библиотеки и сохранить его. Загвоздка в том, что между ними нет «связи»; редактирование одного ничего не изменит в остальных.

Если вы хотите этого, вам нужно создать подкласс NSView.

Я думал о создании подкласса NSView, который при загрузке заменяет себя другим представлением, загружаемым из файла пера, устанавливая связанный объект в качестве владельца файла, но я не уверен, что это самый чистый метод. 1006 *

Это может сработать. Я не думаю, что это действительно так грязно; Причина, по которой методы init возвращают объект, заключается в том, что они могут явно возвращать другой объект. Однако я не уверен, как вы справитесь с представлениями разных фреймов, так как загруженное представление будет иметь любой фрейм в перо.

Другим способом было бы загрузить кнопки с кончика, но вам необходимо настроить их кадры, прежде чем добавлять их в качестве подпредставлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...