iOS 获取键盘窗口

2023-11-23

所以在 iOS 7 中我总是得到这样的键盘窗口:

- (UIView *)keyboardView
{
    UIWindow* tempWindow;

    //Because we cant get access to the UIKeyboard throught the SDK we will just use UIView.
    //UIKeyboard is a subclass of UIView anyways
    UIView* keyboard;

    NSLog(@"windows %d", [[[UIApplication sharedApplication]windows]count]);

    //Check each window in our application
    for(int c = 0; c < [[[UIApplication sharedApplication] windows] count]; c ++)
    {
        //Get a reference of the current window
        tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:c];

        //Get a reference of the current view
        for(int i = 0; i < [tempWindow.subviews count]; i++)
        {
            keyboard = [tempWindow.subviews objectAtIndex:i];
            NSLog(@"view: %@, on index: %d, class: %@", [keyboard description], i, [[tempWindow.subviews objectAtIndex:i] class]);
            if([[keyboard description] hasPrefix:@"(lessThen)UIKeyboard"] == YES)
            {
                //If we get to this point, then our UIView "keyboard" is referencing our keyboard.
                return keyboard;
            }
        }

        for(UIView* potentialKeyboard in tempWindow.subviews)
            // if the real keyboard-view is found, remember it.
            if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
                if([[potentialKeyboard description] hasPrefix:@"<UILayoutContainerView"] == YES)
                    keyboard = potentialKeyboard;
            }
            else if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
                if([[potentialKeyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
                    keyboard = potentialKeyboard;
            }
            else {
                if([[potentialKeyboard description] hasPrefix:@"<UIKeyboard"] == YES)
                    keyboard = potentialKeyboard;
            }
    }


    NSLog(@"view: %@, on index: %d", [keyboard description]);
    return keyboard;
}

但在 iOS 8 beta 1 和 2 中,返回的窗口/视图是主应用程序窗口。知道我的代码有什么问题吗?在我的 iOS 7 测试设备上,它运行得很好......


我也遇到了这个问题并找到了解决方案。

以下代码适用于 iOS 8.0 及以下版本。

我已经在 iOS 7 和 8.0(Xcode 版本 6.0.1)上测试过

- (void)addButtonToKeyboard
{
    // create custom button
    self.doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    self.doneButton.frame = CGRectMake(0, 163+44, 106, 53);
    self.doneButton.adjustsImageWhenHighlighted = NO;
    [self.doneButton setTag:67123];
    [self.doneButton setImage:[UIImage imageNamed:@"doneup1.png"] forState:UIControlStateNormal];
    [self.doneButton setImage:[UIImage imageNamed:@"donedown1.png"] forState:UIControlStateHighlighted];

    [self.doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];

    // locate keyboard view
    int windowCount = [[[UIApplication sharedApplication] windows] count];
    if (windowCount < 2) {
        return;
    }

    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    UIView* keyboard;

    for(int i = 0 ; i < [tempWindow.subviews count] ; i++)
    {
        keyboard = [tempWindow.subviews objectAtIndex:i];
        // keyboard found, add the button

        if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES){
            UIButton* searchbtn = (UIButton*)[keyboard viewWithTag:67123];
            if (searchbtn == nil)//to avoid adding again and again as per my requirement (previous and next button on keyboard)
                [keyboard addSubview:self.doneButton];

        }//This code will work on iOS 8.0
        else if([[keyboard description] hasPrefix:@"<UIInputSetContainerView"] == YES){

            for(int i = 0 ; i < [keyboard.subviews count] ; i++)
            {
                UIView* hostkeyboard = [keyboard.subviews objectAtIndex:i];

                if([[hostkeyboard description] hasPrefix:@"<UIInputSetHost"] == YES){
                    UIButton* donebtn = (UIButton*)[hostkeyboard viewWithTag:67123];
                    if (donebtn == nil)//to avoid adding again and again as per my requirement (previous and next button on keyboard)
                        [hostkeyboard addSubview:self.doneButton];
                }
            }
        }
    }
}

>

    -(void) removedSearchButtonFromKeypad{

    int windowCount = [[[UIApplication sharedApplication] windows] count];
    if (windowCount < 2) {
        return;
    }

    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];

    for(int i = 0 ; i < [tempWindow.subviews count] ; i++)
    {
        UIView* keyboard = [tempWindow.subviews objectAtIndex:i];

        if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES){
            [self removeButton:keyboard];

        }else if([[keyboard description] hasPrefix:@"<UIInputSetContainerView"] == YES){

            for(int i = 0 ; i < [keyboard.subviews count] ; i++)
            {
                UIView* hostkeyboard = [keyboard.subviews objectAtIndex:i];

                if([[hostkeyboard description] hasPrefix:@"<UIInputSetHost"] == YES){
                    [self removeButton:hostkeyboard];
                }
            }
        }
    }
}


-(void) removeButton:(UIView*)keypadView{
    UIButton* donebtn = (UIButton*)[keypadView viewWithTag:67123];
    if(donebtn){
        [donebtn removeFromSuperview];
        donebtn = nil;
    }
}

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 获取键盘窗口 的相关文章

  • ios7 navigationController PushViewController 动画错误

    看来我在 navigationController PushViewController 方法中发现了一个错误 为了重新创建它 我采用了示例主详细信息项目并对 didSelectRow method void tableView UITab
  • SwiftUI:状态栏颜色

    有没有办法将 SwiftUI 视图的状态栏更改为白色 我可能错过了一些简单的东西 但我似乎找不到在 SwiftUI 中将状态栏更改为白色的方法 到目前为止我只看到 statusBar hidden Bool 状态栏文本 色调 前景色可以通过
  • 在 SwiftUI 中使用分段式选取器在两个页面之间滑动

    我有一个Picker with pickerStyle SegmentedPickerStyle 使其成为分段控件 我想让页面在之间平滑滑动 而不是使用条件语句替换视图 这是我迄今为止所做的 gif 这是到目前为止的代码 由if 而不是在不
  • 在带有 Storyboard 的 XCode 4 中以模态方式推送视图时,出现“对开始/结束外观转换的不平衡调用”警告

    在网上进行了一些研究但没有成功后 我来这里向您询问有关我的警告的问题 实际上 我有一个带有导航控制器的视图 V1 我想在 V1 完成加载时推送模态视图 V2 所以我用performSegueWithIdentifier方法 我正在使用故事板
  • 如何解决 CoreData mogenerator 未找到问题

    我收到如下所示的错误 我不知道我错过了什么 我该如何解决这个问题 如下图所示 Users nischalhada Documents XcodePro mnepalnews revisited 2 0 CoreData mogenerato
  • 如何在 iOS 中更改部分透明图像的颜色?

    我有一个具有部分透明度的单色图像 我有正常版本和 2X 版本的图像 我希望能够用代码将图像着色为不同的颜色 下面的代码适用于普通图像 但 2X 最终会出现伪影 正常图像可能有类似的问题如果是这样 由于分辨率的原因我无法检测到它 UIImag
  • 使用 Interface Builder 创建 UIScrollView 的步骤

    我正在尝试使用 UIScrollView 但似乎有一些基本的事情我不理解 假设我想在我的 iPhone 应用程序中使用 UIScrollView 我有一个充满按钮的视图 尺寸为 320x700 显然 这对于 320x480 的 iPhone
  • 添加自定义过渡会导致 xib 加载错误的屏幕尺寸

    我正在尝试向具有 xib 的 UIViewController 添加自定义过渡 我尝试了几种方法 但它们都有相同的问题 视图显示的屏幕尺寸错误 我当前的示例基于以下教程 使用 Swift 在 iOS 中自定义 UIViewControlle
  • 如何恢复消耗品应用内购买?

    我正在开发一款 iOS 游戏 用户可以通过应用内消耗品购买一定数量的内部货币 比如 1000 金币 如果用户想将余额从一台设备转移到另一台设备 如何恢复消耗品购买 在苹果的文档中 它说我们必须使用我们自己的服务器 但是如何获取用户的Appl
  • 关于窗口层次结构的警告

    我的调试器中出现这样的警告 这是什么意思 Warning Attempt to present
  • SiriKit 错误:此应用程序不支持捐赠意图

    我在 Xcode 10 iOS 12 Beta 中捐赠自定义意图时遇到问题 我创建了一个在我的主应用程序目标和 OrderIntent 目标之间共享的自定义框架 我创建了一个 intentdefinition 文件 并将目标成员资格设置为我
  • 当强制退出/向上滑动以终止 iOS 应用程序而不点击横幅/警报时,如何获取推送通知有效负载?

    我正在构建一个应用程序来处理从 Parse 推送的通知 并尝试创建通知历史记录功能 我已经成功启用了后台模式 因此当应用程序在后台运行时 应用程序可以通过以下方式很好地获取有效负载application didReceiveRemoteNo
  • 我怎样才能勾勒出文本字体?

    我想在边框 轮廓 中显示另一种颜色的文本 我正在尝试使用在 MapOverlayView 中显示文本 text drawAtPoint CGPointMake 0 30 withFont UIFont fontWithName Helvet
  • iphone:如何停止快门动画?

    我有两个问题 1 我想知道如何在相机加载时停止快门动画 我正在使用 UIImagePickerController 我已经参考了堆栈溢出的许多答案 但没有成功 2 我在相机中有一个自定义按钮 使用cameraOverlayView并想通过单
  • 指定访问组时出现 KeychainItemWrapper 错误

    相当长一段时间以来 我一直在使用 KeychainItemWrapper 的 ARC 版本成功读取和写入私有钥匙串项目 我现在正在努力将我的 iOS 应用程序转换为使用共享访问组 以便我的 2 个共享相同应用程序前缀的应用程序可以访问钥匙串
  • 在现有 iOS 应用程序中集成 React-native(0.40.0) 后找不到 Yoga/Yoga.h 头文件

    在我的 Swift iOS 应用程序中集成 React Native 后 我无法构建 yoga Yoga h file cannot be found 我已经浏览了文档 查看了react native github页面 检查了类似问题的SO
  • WhatsApp 显示警告“此项目无法共享。请选择其他项目。”对于 iOS 应用程序。

    我正在开发一个 iOS 应用程序 在该应用程序中 我有社交共享功能 并且社交共享功能使用深度链接来共享 URL 该网址共享对于所有应用程序都运行良好 除了WhatsApp 它会显示一个警报弹出窗口 此项目无法共享 请选择其他项目 以下是我的
  • git 提交错误:检测到大文件

    您好 我正在为 ios 8 1 开发一个应用程序 xcode 我已经使用 googleMaps 框架来实现自动完成功能 当我尝试在 Git 中推送我的项目时 我收到大文件检测错误 后来尝试使用 git lfs 并跟踪 git 检测到的文件
  • iPhone 和加密库

    我想我必须在我的 iPhone 应用程序中使用加密库 我想问你有关苹果公司实施的加密货币出口政策的影响 我需要做一些额外的事情吗 例如填写表格等 1 如果我使用 MD5 进行哈希处理 2 如果我使用对称加密 Thanks EDIT 2009
  • 避免 UIImage 的 imageNamed - 内存管理

    我正在经历这个链接 http akosma com 2009 01 28 10 iphone memory management tips 我遇到了一个点避免 UIImage 的 imageNamed 出于什么原因我们应该避免这种情况 它会

随机推荐

  • Linq - 如何从仅包含另一个列表的项目的列表中选择项目?

    我有这两门课 public class Item public int Id get set public List
  • Tomcat 会话超时 web.xml

    这是我的 web xml 文件 它位于WEB INF lib 它指定会话超时时间为 1 分钟 但用户活动 1 分钟后不会超时 Web xml
  • Laravel 嵌套关系

    我无法让非常嵌套的关系在 laravel 中正常工作 想要的行为如下 我通过 ID 选择一个事件 并且想查看哪些人订阅了该事件 现在的问题是事件和人之间有一些表 这是有效的查询 SELECT persons id persons first
  • 在单个标签中使用多种字体颜色

    有没有办法在 iOS 的单个标签中使用两种甚至三种字体颜色 如果使用文本 你好 你好吗 作为示例 那么 你好 将是蓝色的 而 你好吗 将是绿色的 这可能吗 看起来比创建多个标签更容易 参考这里 首先初始化你NSString and NSMu
  • 使用 Npgsql postgres 和 C# 更新命令

    我创建了一个搜索表单来根据称为许可证 ID 的搜索值来查找记录 我能够提取该值的所有字段 我的问题是我正在尝试更新该记录的任何字段 例如 如果我想更新所有这些字段值都在文本框中的地址字段或邮政编码字段 我在 Lname 处或附近遇到语法错误
  • 如何在 Meteor 1.0 中使用 jQuery

    我正在尝试在meteor js 应用程序中使用像这样的jquery JS if Meteor isClient Meteor startup function button click function p toggle 或者没有meteo
  • 相当于 Python 文件的移动百分比

    对于带有以下语言的语言 为了表示块 vim 拥有全能的 钥匙 python代码的等效运动是什么 或者至少以相同的缩进移动到下一行 上一行 The vim wiki建议绑定 例如 nnoremap
  • 如何将 javafx 8 滚动窗格的内容居中

    我有一个 ScrollPane 其中包含一个 GridPane 其中包含一个 ImageView 其中包含一个 Image 我想要的是图像在 GridPane 中居中 如果没有 ScrollPane 我可以使用 setAlignment P
  • 按多个条件子集

    也许这是基本的东西 但我找不到答案 我有 Id Year V1 1 2009 33 1 2010 67 1 2011 38 2 2009 45 3 2009 65 3 2010 74 4 2009 47 4 2010 51 4 2011 1
  • STAThread 和多线程

    来自 MSDN 关于 STAThread 的文章 指示应用程序的 COM 线程模型是单线程单元 STA 作为参考 那就是整篇文章 单线程公寓 好吧 这超出了我的理解范围 另外 我在某处读到 除非您的应用程序使用 COM 互操作 否则该属性实
  • 如何向 WCF 客户端公开枚举属性

    我想向 WCF 客户端应用程序公开枚举属性 但我只能看到枚举值 这是枚举 public enum TemplateType EnumDescription Property Particulars EnumValue PropertyPar
  • 如何使 SET XACT_ABORT ON 回滚事务?

    基于书籍 在线文档SET XACT ABORT ON 我的印象是 如果 T SQL 语句引发运行时错误 则整个事务将终止并回滚 Remarks 当 SET XACT ABORT 为 ON 时 如果 Transact SQL 语句引发运行时错
  • LINQ 在查询中插入 'ESCAPE N'~'

    当我检查 Linq 发出的 SQL 查询时 我注意到它在执行 LIKE 命令时放置了一个 ESCAPE N 我该如何摆脱这个 看起来查询花费的时间是 SQL 中转义符的两倍 这是 LINQ var SearchPhrase xyz var
  • 如何使用 perl cd 进入目录?

    我正在尝试以下 系统 cd目录文件夹 但它失败了 我也尝试系统 退出 离开终端 但它失败了 Code chdir path to dir or die Perldoc chdir EXPR chdir FILEHANDLE chdir DI
  • 用于解析 SQL 参数的正则表达式

    如果我有一个查询 例如SELECT from authors where name name param 是否有正则表达式来解析参数名称 特别是 name param Thanks 这很棘手 因为参数也可能出现在带引号的字符串内 SELEC
  • 重新启动程序未提升

    由于某种原因 我的 C 程序需要以提升的权限重新启动 我使用以下代码来实现它 private static void RestartForPermissionsFix ProcessStartInfo processInfo new Pro
  • 如何加密密码列

    我在 SQL Server 2008 r2 中有用户表 目前还没有加密任何内容 但我想至少对密码进行加密 直到应用程序准备就绪 可以更好地处理这个问题 我可以这样做吗 如何做 手动对密码进行加密 您可以使用 SQL Server 加密列 请
  • 更改部署目标后无法再将应用程序模块导入到单元测试中

    为了在我的快速单元测试中对我的主应用程序目标的公共类进行单元测试 我必须在我的测试中导入我的主应用程序模块 如下所示 import MyAppModuleName 在我将部署目标从 7 0 更改为 8 4 之前 这一切都很好 现在构建和运行
  • 取出特定命名空间的所有类

    有没有办法从特定名称空间获取对象 也许与System Reflections 我想从类型中获取所有对象ITestType在命名空间中Test TestTypes作为对象 以便我有一个实例列表TestType1 TestType2 TestT
  • iOS 获取键盘窗口

    所以在 iOS 7 中我总是得到这样的键盘窗口 UIView keyboardView UIWindow tempWindow Because we cant get access to the UIKeyboard throught th