5

どれだけ読んでも理解できない iOS の概念に行き詰まっています。標準の iOS 数字パッドをカスタム デザインでオーバーライドしようとしています。ユーザーが UITextField に触れると、標準の数字パッドの代わりにカスタム inputView が表示されるようにします。

「customInputViewController」と呼ばれるカスタム inputView 用に別の .h/.m/.xib ViewController クラスを作成しました。現在、これは単なる暗い背景と、UITextField に触れたときに画面の約半分を覆う 1 つのボタンです (数字に似ています)。パッドですが、見た目が違うだけです)。カスタム inputView で 1 つのボタンをクリックすると、実装が失敗します。iOS が EXC_BAD_ACCESS エラーをスローします。

これは、実行時に .xib ファイルをロードし、カスタム inputView を UITextField オブジェクトにアタッチする方法です。

UIViewController *v = [[customInputViewController alloc] initWithNibName:@"customInputDesign" bundle:nil];
myTextInput.inputView = v.view;

カスタム inputView の .xib ファイルで、ファイルの所有者を「customInputViewController」に設定し、(IBAction) メソッドを作成して UIButton にアタッチしました。そのボタンがクリックされると、NSLog(@"Button Clicked") メッセージを送信するように (IBAction) が設定されます。特にない。エラーをスローし続ける単純なボイラープレート実装です。

たぶん、私はこれを完全に間違っています。誰でも簡単な例を提供できますか?

4

2 に答える 2

2

inputViewプロパティが(readwrite、retain)として定義されているため、ビューv.viewは保持されます。ただし、入力ボタンがクリックされる前にcustomInputViewController vをどこかで解放すると、クラッシュが発生します(EXC_BAD_ACCESS)

メインコントローラーでこれを試すことができます:

- (IBAction) keyboardButtonClicked
{
    NSLog(@"keyboard Button Clicked");
}

- (void) viewDidLoad
{
    // do your stuff here ...

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; // add autorelease if you don't use ARC
    v.backgroundColor = [UIColor darkGrayColor];
    UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
    [b setTitle:@"Test button" forState:UIControlStateNormal];
    [b addTarget:self action:@selector(keyboardButtonClicked) forControlEvents:UIControlEventTouchUpInside];
    b.frame = CGRectMake(80, 25, 160, 50);
    [v addSubview:b];
    myTextInput.inputView = v;
}

正常に動作するはずです...

于 2012-11-11T09:58:06.153 に答える
1

まず、これを見てください

UIKitフレームワークには、カスタム入力ビューと入力アクセサリビューのサポートが含まれています。ユーザーがビュー内のテキストやその他の形式のデータを編集するときに、アプリケーションはシステムキーボードの代わりに独自の入力ビューを使用できます。たとえば、アプリケーションはカスタム入力ビューを使用して、ルーン文字のアルファベットから文字を入力できます。入力アクセサリビューをシステムキーボードまたはカスタム入力ビューにアタッチすることもできます。このアクセサリビューは、メインの入力ビューの上部に沿って実行され、たとえば、テキストに何らかの影響を与えるコントロールや、テキストに関する情報を表示するラベルを含めることができます。

アプリケーションがテキスト編集にUITextViewオブジェクトとUITextFieldオブジェクトを使用している場合にこの機能を利用するには、カスタムビューをinputViewプロパティとinputAccessoryViewプロパティに割り当てるだけです。これらのカスタムビューは、テキストオブジェクトがファーストレスポンダーになるときに表示されます...

実際、私はあなたにこのすべての混乱について言及する必要はありませんが、これについて言及する興味深い理由があります。最初の文から、私はview-view-viewについて言及していますが、あなたは別のビューコントローラーで入力ビューを作成しています。あなたはそれをあなたのテキストフィールドの入力ビューとして割り当てようとしていて、initはビューを作成するべきではありません、loadViewはそれを行います。ビューがnilのときにビューゲッター(v.view)を呼び出すと、loadViewが呼び出されます。そのため、EXC_BAD_ACCESSでクラッシュします。

出典:iOS用テキスト、Web、および編集プログラミングガイド

于 2012-11-11T08:00:47.610 に答える