UISearchBar CGContext 错误

55

我有一个UISearchBar放在一个视图里,每次点击它后,键盘弹出来之后 -

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar

它会将以下内容发送到控制台:

<Error>: CGContextSetStrokeColorWithColor: 无效的上下文0x0。这是一个严重错误。这个应用程序或者它使用的库正在使用无效的上下文,从而对系统的稳定性和可靠性造成了影响。此通知是一种礼貌:请解决此问题。在即将推出的更新中,它将变成致命错误。

它会重复相同的错误。我想知道问题到底是什么?

我相信出现了一个NULL上下文,但它与UISearchBar有什么关系呢? 谢谢。


5
你正在使用 iOS 7 beta 吗? - Abdullah Shafique
12
在iOS7SDK/XCode5的最终版本中,开始编辑文本字段时遇到相同的问题... - Elechtron
我认为你不应该将Henning Schulz的答案标记为正确答案,因为在iOS 7.0.1上仍然存在错误! - Mona
还有,在iOS 7中无法将rightview添加到searchbar的textfield中,有什么想法如何添加它吗? - Mehul Thakkar
有人尝试过将带有此“缺陷”的应用程序上传到应用商店吗?是否顺利完成,还是引起了意料之外的问题? - Jesper Martensson
4个回答

22

这是一个已知的问题,苹果正在努力解决。应该会在下一个测试版中修复。

可以在这里查看:Xcode Number pad with decimal error

编辑:对于那些在文本字段上遇到此问题的人,也许这个方法能帮到你:

来自Apple Developer Forums bye Popeye7 - 所有功劳归于他

我找到了解决这个问题的方法!我有3个应用程序出现了这个问题,所以对我来说......这是一个好发现。在 StackOverflow 上找到了解决方案......将两个答案组合到了一个类似的问题中。

在我的情况下,用户点击一个 barButtonItem ,然后会出现一个“警报”或对话框。

我发现 UIAlertView 分配的方式有很大的不同。 “新的方式”有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];
}  

消息由Popeye7于9/25/13下午12:25编辑

消息由Popeye7于9/25/13下午12:33编辑


70
iOS 7 GM 仍存在该问题。 - jjxtra
31
最终版本仍存在该问题。:( - Vaibhav Saran
1
这很奇怪...我在uisearchbar之外得到了这个。我正在进行自定义drawRects并且出现了这个错误。苹果会让这种情况发生似乎很奇怪,但可能是我的问题...我无法确定,因为它似乎是苹果留下的触发其他人的东西。 - John Riselvato
5
我在整个应用程序中都遇到了UITextFields的这个问题...问题是文本字段中没有光标。 - Martin Berger
5
我也遇到了UITextFields的这个问题。 - user216661
显示剩余4条评论

16

删除~/Library/Preferences下的iOS模拟器偏好设置,问题得到了解决。

请前往~/Library/Preferences 将"com.apple.iphonesimulator.plist"文件移到废纸篓中。

有状态的


干得好...你觉得这会不会对其他应用程序产生副作用? - Mehul Thakkar
3
双击文本框后,它会消除错误,但随后又重新开始出现错误。 - Mehul Thakkar

4
似乎UISearchBar在.xib文件中设置的AutoLayout约束引起了问题。如果有任何多余或冲突的约束没有被编译器捕获,就会导致绘图错误并抛出这些错误。
以下是解决方法:
1. 进入包含UISearchBar的.xib文件。 2. 点击UISearchBar并进入Size Inspector(通常位于控件属性的右侧,看起来像一个标尺)。 3. 逐个点击每个约束并查看它们所测量的位置 - 没有两个约束应该测量相同的属性。例如,在我的项目中,我有一个约束从控件的顶部到视图的顶部,另一个约束从控件的底部到视图的顶部。 4. 删除任何冲突的约束,构建并运行!如果这不起作用,您可能需要检查周围控件的约束。

3
我没有使用自动布局,但我也遇到了这个问题。 - glasz
当IB似乎“困惑”并且找不到满足所有约束条件的任何框架时,我在控制台中看到了这个错误。(尽管我怀疑这不是唯一的原因...) - Ben Mosher

3
这个“缺失上下文”的问题似乎是iOS 7的一个bug,只会发生在空文本框中。在这个问题被苹果修复之前(可能永远不会),我在我的项目中使用了一个轻量级的解决方法。
// 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的使用情况,并降低了用户体验。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接