0

アプリにカスタム キーボードを実装しています。キーボードを複数の「タイプ」のテキストフィールドに適用できるようにしたい(すべて数値ですが、負の値と厳密に正の値、整数と小数の値を持つものもあります)。textField の「タイプ」に応じて 1 つまたは 2 つのボタンを非表示にすることで、これを実現したいと考えています。

キーボードを作成し、textFields (xValue) のいずれかの inputView として割り当てることができます。また、入力として整数を受け取り、キーボード ボタン変更するメソッドをキーボードの ViewController に記述しました。現時点では、このメソッドは ViewController の viewDidLoad メソッドで機能しますが、キーボードが初期化される ViewController クラスからこれを呼び出したいと考えています。私がそれを呼び出そうとすると、非表示のプロパティは変更されません。

テキストフィールドを含む ViewController の viewDidLoad に、次のように記述しました。

DCKeyboard *dckvc = [[DCKeyboard alloc] initWithNibName:@"DCKeyboard" bundle:nil];
[dckvc modifyKeyboardType:0 doneNextValue:0];    // Has no effect
xValue.inputView = dckvc.view;

そして DCKeyboard.m で私は定義しました:

@synthesize doneNextButton;
@synthesize decimalButton;
@synthesize posNegButton;

-(void) modifyKeyboardType:(int)buttonTypeNumber doneNextValue:(int)doneNextNumber {

    switch (buttonTypeNumber) {
    case 0:      // Case 0: All buttons available
        decimalButton.hidden = NO;
        posNegButton.hidden = NO;
        break;
    case 1:      // Case 1: No decimal button
        decimalButton.hidden = YES;
        posNegButton.hidden = NO;
        break;
    case 2:      // Case 2: No positive/negative button
        decimalButton.hidden = NO;
        posNegButton.hidden = YES;
        break;
    case 3:      // Case 3: No decimal or positive/negative button
        decimalButton.hidden = YES;
        posNegButton.hidden = YES;
        break;
    default:
        break;
    }

    switch (doneNextNumber) {
    case 0:      // Case 0: Done
        [doneNextButton setImage:[UIImage imageNamed:@"DoneButton.png"] forState:UIControlStateNormal];
        [doneNextButton setImage:[UIImage imageNamed:@"DoneButtonDown.png"] forState:UIControlStateHighlighted];
        break;
    case 1:      // Case 1: Next
        [doneNextButton setImage:[UIImage imageNamed:@"NextButton.png"] forState:UIControlStateNormal];
        [doneNextButton setImage:[UIImage imageNamed:@"NextButtonDown.png"] forState:UIControlStateHighlighted];
        break;
    default:
        break;
    }
}

これを上記のように呼び出そうとすると、

前述のように、次のように DCKeyboard の viewDidLoad メソッドからこれを呼び出すと、機能するので、すべてを正しく設定し、コードが機能することを確信しています。基本的な概念が欠けているに違いありません。

- (void)viewDidLoad {
    [super viewDidLoad];

    [self modifyKeyboardType:3 doneNextValue:1]; // This works
}
4

2 に答える 2

0

IBOutletsビューがウィンドウにロードされていない限り、何も指していないからです。したがって、そこにあるプロパティのいずれかを変更しようとしても、何も起こりません。

これは、xib ファイルがアーカイブされてお​​り、画面に表示されるまでオブジェクトにアクセスできないために発生します。したがって、ビューが画面にロードされた後に呼び出される最初のメソッドである viewDidLoad でそのメソッドを呼び出すことができますpresentModalViewController:animated:pushViewController:animated:

于 2011-08-21T16:51:59.907 に答える
0

基礎となるビューは、実際に必要になるまで作成されない場合があります。この場合は、プロパティにアクセスするときですdckvc.view。そのため、メソッドを呼び出すと、modifyKeyboardType:doneNextValue:実際には非表示になるビューはありません。

ビューが読み込まれることを確認するまでこの呼び出しを延期するか、キーボードの種類に渡した値をキャッシュして、viewDidLoad上書きで使用してキーボードを更新することができます。

于 2011-08-21T16:46:58.660 に答える