在警报级别窗口中使用自定义inputView的UIControl

时间:2013-07-19 20:40:26

标签: ios objective-c uiwindow uiresponder

我有一个自定义提醒视图,该视图显示在自己的UIWindow中,其windowLevel属性设置为UIWindowLevelAlert。该警报包含一个带有常规键盘的文本字段,以及一个返回UIControl UIDatePicker的自定义inputView子类。

当系统显示日期选择器以响应控件成为第一响应者时,日期选择器隐藏在警报视图之后。我的解决方案是在控件reloadInputViews中调整选择器窗口的窗口级别:

- (void)reloadInputViews
{
    [super reloadInputViews];
    if (self.datePicker.window.windowLevel < self.window.windowLevel)
    {
        self.datePicker.window.windowLevel = self.window.windowLevel;
    }
}

问题是当文本字段和自定义控件之间快速切换时应用程序冻结(暂停调试器显示主线程卡在mach_msg_trap上)。我怀疑它可能是窗口级别的这个技巧,但我无法验证。

有没有更“正确”的方法来解决这个问题?什么是mach_msg_trap?

谢谢!

1 个答案:

答案 0 :(得分:0)

经常发生这种情况,我在发布后不久就明白了......

正如mach_msg_trap指令提示的那样,这是一个线程问题,与日期选择器控件的实现无关。

我在其他地方修复了一些NSLock个对象,这似乎解决了这个问题。