10

アプリケーションのいくつかの部分で、ユーザーがパスワードを入力できるコントロールが必要です。パスワードフィールドは安全ですが、ユーザーがフィールドをプレーンテキストに切り替えてタイプミスなどをチェックできるようにしてほしい.

パスワード フィールド自体は問題ありません。必要な動作を得るために、NSSecureTextField をサブクラス化しました。バインド可能にすると、別のコントロール (チェックボックスなど) から表示を切り替えることができます。

ここに画像の説明を入力 ここに画像の説明を入力

今、これをアプリケーション内の複数の場所で再利用したいと考えています。これが必要な場所ならどこでも、チェックボックスと一緒にカスタムセキュアテキストフィールドを使用するだけです。しかし、私はこれらの部分を再利用可能なコンポーネントにグループ化することを好みます。

そこで、インターフェイス ビルダーを使用して作成します。

ここに画像の説明を入力

さて、それを別のウィンドウでどのように使用できますか? ウィンドウに「カスタム ビュー」コンポーネントを追加し、そのタイプを適切に設定しました。

ここに画像の説明を入力

しかし、実行時には空きスペースができます。

1 - おそらくビューが .xib で定義されているため - .xib から PasswordView インスタンスをロードするには、コードで何かを行う必要があります。しかし、私は正確に何をする必要がありますか? 私はこれを解決するのに苦労しています。

具体的には:

  • .xib からビューのインスタンスをロードするプロセス/API は何ですか? これに関するドキュメントを見つけるのに苦労しています。

  • ビューのインスタンスをロードしたら、それをカスタム ビューの「プレースホルダー」の代わりに挿入する方法を教えてください。おそらく、カスタム ビューへのアウトレットが必要ですが、その後はどうでしょうか。ロードしたインスタンスをアウトレットに割り当てるだけですか? サブビューとしてアウトレットに追加することになっていますか?

  • このロジックはどこで発生する必要がありますか? init内、AwakeFromNib内?

2 - カスタム ビュー ( example ) にNSViewController を使用して、そのようにロードできることを知っています。しかし、これだけのためにView Controllerが本当に必要なのでしょうか? スタンドアロンのビューを作成して簡単にインスタンス化できるように思えます...しかし、これは Cocoa の「やり方」ではないでしょうか? 複数の .xib からビューを構成する簡単な方法が必要だと思われますが、すべてのサブビュー (テキスト フィールドまたはボタンの場合もあります) にコントローラーを必要としませんが、私はそれを見つけていません。 ..

前もって感謝します。

4

1 に答える 1

0

私があなたの質問から得ている場合-passwordTextFieldとcheckBoxを含むウィンドウを持つXIBがあります。

そして、パスワードフィールドを表示する必要があるたびに、この xib ウィンドウをロードする必要があります。


ウィンドウを作成しないことをお勧めします。passwordTextField と checkBox を使用して NSView を作成できます。

すべてのウィンドウで空のビューを描画し、この 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
于 2013-02-25T15:43:35.353 に答える