1

テキストフィールドの編集が開始されるたびに表示される(電卓の)ポップアップビューがあります。displayメソッドが呼び出されるコードとdisplayメソッド自体は以下に掲載されています。

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    //the background color may have been yellow if someone tried to submit the form with a blank field
    textField.backgroundColor = [UIColor whiteColor];

    sender = @"text field";

    [self displayCalculator:textField.frame];

    return YES;
}

ビューを表示する方法は次のとおりです。

-(IBAction)displayCalculator:(CGRect)rect{

    calculator = [[CalculatorViewController alloc] initWithNibName:@"CalculatorViewController" bundle:nil];
    popoverController = [[[UIPopoverController alloc] initWithContentViewController:calculator] retain];

    [popoverController setPopoverContentSize:CGSizeMake(273.0f, 100.0f)];

    [popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

}

私の質問は次のとおりです。

1)ポップオーバーをそのままにしておくにはどうすればよいですか?ユーザーがテキストフィールド(最初にポップアップを表示したテキストフィールド)をクリックできるようにしたいのですが、クリックするとポップアップが消えます。

2)ポップアップがテキストフィールドをブロックするように表示されることがありますが、ポップアップが表示される場所を制御できる方法はありますか?現在、テキストフィールドのフレームを渡していますが、機能していないようです。

4

2 に答える 2

2

ドキュメントをチェックして、必要なタスクや機能に対応するメソッドやプロパティがあるかどうかを確認することをお勧めします(UIPopoverController) 。

最初の問題については、passthroughViewsプロパティを確認する必要があるようです。

passthroughViews

ポップオーバーが表示されている間にユーザーが操作できるビューの配列。@property(nonatomic、copy)NSArray*passthroughViewsディスカッション

ポップオーバーがアクティブな場合、ポップオーバーが閉じられるまで、他のビューとの対話は通常無効になります。ビューの配列をこのプロパティに割り当てると、ポップオーバーの外側のタップを対応するビューで処理できるようになります。

2番目の問題(テキスト領域をカバー)では、textField.frameをオフセットしCGRectて、popoverControllerがアンカーとして使用する新しいものを定義できます。

CGRect targetRect = CGRectOffset(textField.frame, n, n);
于 2012-07-27T21:14:55.173 に答える
1

(問題1)displayCalculatorメソッドで、ポップアップがすでに表示されているかどうかを確認する方法が必要です。現在のところ、textFieldが更新されるたびに、ポップアップが再描画されます。textFieldDelegate呼び出しをに変更しましたtextFieldDidBeginEditing

これを試して:

-(BOOL)textFieldDidBeginEditing:(UITextField *)textField {

    //the background color may have been yellow if someone tried to submit the form with a blank field
    textField.backgroundColor = [UIColor whiteColor];

    sender = @"text field";

    [self displayCalculator:textField.frame];

    return YES;
}

-(IBAction)displayCalculator:(CGRect)rect{

//We don't want to continually create a new instance of popoverController. So only if it is nil we create one. 
if (popoverController == nil)
    calculator = [[CalculatorViewController alloc] initWithNibName:@"CalculatorViewController" bundle:nil];
    popoverController = [[[UIPopoverController alloc] initWithContentViewController:calculator] retain];

    [popoverController setPopoverContentSize:CGSizeMake(273.0f, 100.0f)];
}

//Check to make sure it isn't already showing. If it's not, then we show it. 
if (!popoverController.popoverVisible) {
    [popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

}

編集

スキニーが指摘したように(私は言及すべきだった)。ポップオーバーの外側に触れると、ポップオーバーは閉じます。これが、textFieldDelegateがtextFieldDidBeginEditingに変更された理由です。

これはあなたを助けることができるかもしれない良いチュートリアルです。

他のすべてが失敗した場合は、独自のポップオーバーを作成してください。

于 2012-07-27T21:05:54.520 に答える