2013-02-25 2 views
10

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

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

enter image description here enter image description here

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

Так я создаю один с помощью интерфейса строитель:

enter image description here

Теперь, как я могу использовать это в моих разных окнах? Я добавил компонент «пользовательский фильтр» к моему окну, и установить ее тип соответственно:

enter image description here

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

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

В частности:

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

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

  • Куда эта логика должна произойти? Внутри init, внутри AwakeFromNib?

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

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

+0

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

+0

@ Daij-Djan спасибо, но я добавил некоторые особенности к моему вопросу о своих конкретных точках прилипания – TheNextman

+0

Можно ли загружать .xib из IB? – tofutim

ответ

0

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

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


Я хотел бы предложить вам не создать окно, вы можете создать NSView с passwordTextField и CheckBox.

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


EDIT:

Вот некоторые примеры кода, как я использую, чтобы загрузить 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 
+0

Спасибо. Я создал многоразовый NSView, содержащий мои отдельные компоненты. Мой вопрос, в частности, связан с проблемой загрузки xib в представления, которые нужно повторно использовать. Я добавил некоторые разъяснения по моим конкретным точкам прилипания. – TheNextman

+0

Итак, вы застряли при загрузке представления на нужном месте/в представлении? –

+0

Да; технически я не могу понять это, и мне трудно найти документацию. Я даже не понимаю теоретический «способ какао» этого, чтобы попытаться выяснить техническую сторону. – TheNextman

Смежные вопросы