Многоразовый NSView из .xib

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

Само поле пароля не проблема. Я создал подклассы NSSecureTextField, чтобы получить желаемое поведение. Я делаю его привязываемым, поэтому я могу переключать отображение с другого элемента управления (скажем, флажка).

введите описание изображения здесь введите описание изображения здесь

Теперь я хочу повторно использовать это в нескольких местах моего приложения. Я могу просто использовать свое настраиваемое защищенное текстовое поле рядом с флажком везде, где мне это нужно. Но я бы предпочел сгруппировать эти части в один компонент многократного использования.

Итак, я создаю его с помощью конструктора интерфейсов:

введите описание изображения здесь

Как я могу использовать это в разных окнах? Я добавил в свое окно компонент Custom View и установил его тип соответствующим образом:

введите описание изображения здесь

Но во время выполнения я просто получаю пустое место.

1 - Предположительно, потому что мое представление определено в .xib - мне нужно сделать что-то в коде, чтобы загрузить мой экземпляр PasswordView из .xib; но что именно мне нужно делать? У меня проблемы с этим.

В частности:

  • Каков процесс / API для загрузки экземпляра моего представления из .xib? Мне не удается найти документацию по этому поводу.

  • Как только я загрузил экземпляр своего представления, как вставить его вместо заполнителя моего пользовательского представления? Предположительно мне нужен выход для моего пользовательского представления, но что тогда? Могу ли я просто привязать загруженный экземпляр к розетке? Должен ли я добавить его как подвид к розетке?

  • Где должна происходить эта логика? Внутри init, внутри AwakeFromNib?

2 - Я знаю, что могу использовать NSViewController для своего пользовательского представления (пример ) , и загрузите его таким образом. Но действительно ли мне нужен контроллер представления только для этого? Кажется, я должен просто иметь возможность создавать автономные представления и легко создавать их экземпляры ... Но, может быть, это не способ Какао? Мне кажется, что должен быть простой способ составить представление из нескольких файлов .xib без необходимости использования контроллера для каждого подвид (которое может быть просто текстовым полем или кнопкой), но я его просто не нахожу. ..

Заранее спасибо.


person TheNextman    schedule 25.02.2013    source источник
comment
вы говорите это, вам нужен код для загрузки вашего NSView всякий раз, когда он вам нужен, и размещения его в представлении ... вы ничего не можете сделать из коробки с помощью конструктора интерфейсов   -  person Daij-Djan    schedule 25.02.2013
comment
@ Daij-Djan, спасибо, но я добавил несколько деталей к моему вопросу о моих проблемах.   -  person TheNextman    schedule 25.02.2013
comment
Можно ли загрузить .xib из ИБ?   -  person tofutim    schedule 20.02.2014


Ответы (1)


Если я понимаю ваш вопрос - у вас есть окно XIB, содержащее passwordTextField и checkBox.

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


Я бы посоветовал вам не создавать окно, вы можете создать NSView с помощью passwordTextField и checkBox.

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


ИЗМЕНИТЬ:

Вот пример кода, который я использую для загрузки labelView в главное окно.

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize myLabelViewController;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{

    myLabelViewController=[[LabelView alloc] initWithNibName:@"LabelView" bundle:nil];
    [_window setContentView:[myLabelViewController view]];

}

@end

LabelView.h

#import <Cocoa/Cocoa.h>

@interface LabelView : NSViewController

@end

LabelView.m

#import "LabelView.h"

@implementation LabelView

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Initialization code here.
    }

    return self;
}

@end
person Anoop Vaidya    schedule 25.02.2013
comment
Спасибо. Я создал многоразовый NSView, содержащий мои отдельные компоненты. Мой вопрос конкретно относится к проблеме загрузки этого xib в представления для повторного использования. Я добавил некоторые пояснения по поводу моих проблем. - person TheNextman; 25.02.2013
comment
Итак, вы застряли при загрузке представления в нужном месте / просмотре? - person Anoop Vaidya; 25.02.2013
comment
Да; технически я не могу это понять, и у меня проблемы с поиском документации. Я даже не понимаю теоретический "какао-способ" сделать это, чтобы самому попытаться выяснить техническую сторону. - person TheNextman; 25.02.2013
comment
Пожалуйста, прочтите специфику моего вопроса. Действительно ли NSViewController - единственный способ сделать это? Даже если мое настраиваемое представление представляет собой простую группировку компонентов, не требующую логики «контроллера»? Я чувствую, что должен иметь возможность создать экземпляр представления непосредственно из .xib в настраиваемый «заполнитель» представления, определенный в Interface Builder ... - person TheNextman; 25.02.2013
comment
Если вы хотите следовать MVC, вам следует использовать nsviewController. Как вы, должно быть, много раз чувствовали, мы создаем модель, представление и контроллер отдельно, и мы могли бы объединить модель в контроллере и т. Д. - person Anoop Vaidya; 25.02.2013