web-dev-qa-db-ja.com

UISearchBar CGContextエラー

ビュー内にUISearchBarがあり、それをタップするたびに、キーボードが起動した後-

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBarの後

これをコンソールに送信します。

<エラー>:CGContextSetStrokeColorWithColor:無効なコンテキスト0x0。これは重大なエラーです。このアプリケーション、またはそれが使用するライブラリは無効なコンテキストを使用しているため、システムの安定性と信頼性の全体的な低下に寄与しています。この通知は礼儀です。この問題を修正してください。今後のアップデートでは致命的なエラーになります。

同じエラーを繰り返します。何が問題になり得るのでしょうか?

[〜#〜] null [〜#〜]コンテキストはあると思いますが、UISearchBarとはどう関係があるのでしょうか? tnx。

55
henTdev

これは、Appleが取り組んでいる既知の問題です。次のベータリリースで修正される予定です。

こちらをご覧ください: Xcode Number pad with decimal error

編集:テキストフィールドでその問題を抱えている人にとっては、おそらくこれであなたは回避できるはずです:

From Apple Developer Forums bye Popeye7-だから彼へのすべてのクレジット

この問題の修正を見つけました!私はこれが今壊れている3つのアプリを持っているので、私にとって...これは良い発見です。 StackOverflowでソリューションを見つけました...同様の質問に対する2つの回答を組み合わせました。

私の場合、ユーザーがbarButtonItemをタップすると、「アラート」またはダイアログが表示されます。

大きな違いは、UIAlertViewの割り当て方法にあります。 「NEW WAY」にはtextFieldが表示されており、必要に応じてキーボードが表示されます。

これで、textFieldを表示し、テキストを入力することができ、期待どおりに機能します。 「initWithFrame」を再び追加しても、textFieldの配置には影響しません。

古い方法....

- (IBAction)addEntryTapped:(id)sender

{

    [_editorTextView resignFirstResponder];
    [self saveTextChanges];
    [self dismissPopovers];

    _Prompt = [[UIAlertView alloc] initWithTitle:@"New Entry Title..."
                                         message:@"\n\n\n" // IMPORTANT
                                        delegate:self
                               cancelButtonTitle:@"Cancel"
                               otherButtonTitles:@"OK", nil];

    _textField = [[UITextField alloc] initWithFrame:CGRectMake(17.0, 55.0, 250.0, 25.0)];

    [_textField setBackgroundColor:[UIColor whiteColor]];
    [_textField setPlaceholder:@"New Entry Title"];

    _textField.borderStyle = UITextBorderStyleRoundedRect;
    _textField.autocapitalizationType = UITextAutocapitalizationTypeWords;
    _textField.autocorrectionType = UITextAutocorrectionTypeNo;

    [_Prompt addSubview:_textField];
    [_Prompt show];

    // set cursor and show 
    [_textField becomeFirstResponder];
}

新しい方法...

- (IBAction) addEntryTapped:(id)sender
{
    [_editorTextView resignFirstResponder];
    [self saveTextChanges];
    [self dismissPopovers];

    _Prompt = [[UIAlertView alloc] init];
    _Prompt.alertViewStyle = UIAlertViewStylePlainTextInput;

    UITextField *text = [_Prompt textFieldAtIndex:0];
    _textField = text;

    [_Prompt setDelegate:self];
    [_Prompt setTitle:@"New Entry Title..."];
    [_Prompt setMessage:@""];
    [_Prompt addButtonWithTitle:@"Cancel"];
    [_Prompt addButtonWithTitle:@"OK"];
    [_textField setPlaceholder:@"New Entry Title"];

    _textField.autocapitalizationType = UITextAutocapitalizationTypeWords;
    _textField.autocorrectionType = UITextAutocorrectionTypeNo;

    [_Prompt show];

    // set cursor and show keyboard
    [_textField becomeFirstResponder];
}  

メッセージは9/25/13の12:25 PMにPopeye7によって編集されました

メッセージは9/25/13の12:33 PMにPopeye7によって編集されました

22
Henning Schulz

〜/ Library/PreferencesからiOSシミュレーターの設定を削除すると、これはなくなりました。

〜/ Library/Preferencesに移動します。「com.Apple.iphonesimulator.plist」をゴミ箱にドロップします。

ステートフル

16
Stateful

.xibファイルに設定されているUISearchBarのAutoLayout制約がこの問題を引き起こしているようです。コンパイラによって捕捉されなかった冗長または競合する制約がある場合、描画エラーが発生し、これらのエラーがスローされる可能性があります。

  1. UISearchBarがある.xibファイルに移動します
  2. UISearchBarをクリックして、[サイズインスペクター]に移動します(通常、コントロールのプロパティがある右側にあるルーラーのように見えます)。
  3. 1つ1つ、各制約をクリックして、それらがどこにあるかを確認します。同じプロパティを測定する2つの制約はありません。たとえば、私の場合、コントロールの上部からビューの上部までを測定する1つの制約と、コントロールの下部からビューの上部までを測定する別の制約がありました。
  4. 問題のある制約を削除し、ビルドして実行してください!それでもうまくいかない場合は、周囲のコントロールの制約を確認してください。
4
Christine

この「コンテキストの欠落」はiOS 7のバグのようで、空のテキストフィールドでのみ発生するようです。 Apple(おそらく決して;))によってこの問題が修正されるまで、プロジェクトで軽量な回避策を使用しています。

// or wherever
- (void)viewDidLoad
{
     if([textfield.text isEqualToString:@""] || textfield.text == nil)
     {
           textfield.text = @" ";
     }
     ...
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)theTextField
{
     [[NSNotificationCenter defaultCenter] addObserver:self
                                              selector:@selector(keyboardDidShow:)
                                                  name:UIKeyboardDidShowNotification
                                                object:nil];
     return YES;
}

- (void)keyboardDidShow:(NSNotification *)notification
{
    if([textField.text isEqualToString:@" "])
    {
         textField.text = @"";
    }
}

...それは私のためにそれをしました。

編集:もちろん、UITextFieldDelegateを実装する必要があります。編集2:残念ながら、それは私が期待したとおりに機能しませんでした。エラーはなくなりましたが、ほとんどの場合空白文字は削除されません...誰もがこれに対する解決策を手に入れましたか?編集3:私はその問題をあきらめています。この方法では、UITextFieldのすべてのユースケースがカバーされるわけではなく、UXが低下します。

3
max.mustermann