我已经为iPhone和SDK下载了iOS 8 Gold Master。
我测试了应用程序并且它工作正常,除了一件事。
我有一个文本字段,如果用户想要键入内容,则会出现数字键盘,此外,当键盘出现时,自定义按钮会添加到空白区域。
- (void)addButtonToKeyboard
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
// create custom button
UIButton * doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
doneButton.frame = CGRectMake(-2, 163, 106, 53);
doneButton.adjustsImageWhenHighlighted = NO;
[doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
[doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
[doneButton addTarget:self action:@selector(saveNewLead:) forControlEvents:UIControlEventTouchUpInside];
// locate keyboard view
UIWindow * tempWindow = [[[UIApplication sharedApplication] windows]objectAtIndex:1];
UIView* keyboard;
for(int i=0; i<[tempWindow.subviews count]; i++)
{
keyboard = [tempWindow.subviews objectAtIndex:i];
// keyboard view found; add the custom button to it
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
[keyboard addSubview:doneButton];
} else {
if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
[keyboard addSubview:doneButton];
}
}
}
}
到目前为止这个工作正常。
首先,我收到了这个警告:
找不到支持键盘类型4的键盘 iPhone画像,数字小;运用 3876877096_Portrait_iPhone-简单-Pad_Default
然后该自定义按钮也没有显示,我认为因为这两行:
if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
和
if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
有什么建议吗?
答案 0 :(得分:136)
更新到最新的Xcode Beta后,我也遇到了这个问题。刷新模拟器上的设置,因此正在检测笔记本电脑(外部)键盘。如果您只需按:
iOS模拟器 - &gt;硬件 - &gt;键盘 - &gt;连接硬件键盘
以便输入为UNchecked,然后再次显示软件键盘。
答案 1 :(得分:38)
模拟器试图在Mac上找到一个数字小键盘,但找不到(MacBook Pro,MacBook Air和&#34;普通/小型&#34;键盘没有它)。您可以取消选择“连接硬件键盘”选项,或者只是忽略错误消息,它对应用程序没有负面影响。
答案 2 :(得分:12)
我在ios 8中使用xcode只是取消选中模拟器中的连接硬件键盘选项 - &gt;硬件&GT;键盘 - &GT;连接硬件键盘。
这将解决问题。
答案 3 :(得分:10)
我也有这个问题并找到了解决方案。
以下是适用于iOS 8.0以及以下版本的代码。
我已在iOS 7和8.0(Xcode版本6.0.1)
上测试过它- (void)addButtonToKeyboard
{
// create custom button
self.doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
//This code will work on iOS 8.3 and 8.4.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.3) {
self.doneButton.frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.height - 53, 106, 53);
} else {
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 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.3) {
UIButton *searchbtn = (UIButton *)[keyboard viewWithTag:67123];
if (searchbtn == nil)
[keyboard addSubview:self.doneButton];
} else {
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];
}
}
}
}
}
}
&GT;
- (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 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.3){
[self removeButton:keyboard];
} else 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;
}
}
希望这有帮助。
但是,我仍然收到这个警告:
无法找到支持键盘iPhone-Portrait-NumberPad的4型键盘;使用3876877096_Portrait_iPhone-Simple-Pad_Default
忽略这个警告,我开始工作了。 如果你能从这个警告中得到解脱,请告诉我。
答案 4 :(得分:10)
转到
iOS模拟器 - &gt;硬件 - &gt;键盘 - &gt;取消选中“连接硬件键盘选项”。
这将解决问题。
执行上述步骤后,您的MAC键盘将无法工作,您必须使用模拟器键盘。
答案 5 :(得分:7)
我在Xcode 8.1和iOS 10.1中遇到了同样的问题。对我有用的是进入模拟器 - &gt;硬件 - &gt;键盘和取消选中连接硬件键盘。
答案 6 :(得分:5)
使用模拟器
运行应用程序iOS模拟器 - &gt;硬件&GT;键盘 - &gt; iOS使用与OS X相同的布局
如果有人在他们的设备上运行他们的应用程序
,这将解决问题答案 7 :(得分:4)
进入模拟器 - &gt;硬件 - &gt;键盘和取消选中连接硬件键盘。
与 BUT 之上的许多答案一样,在我退出并重新启动模拟器之前,我没有改变。 xcode 8.2.1和Simulator 10.0。
答案 8 :(得分:1)
我使用分发配置文件时遇到了同样的问题。检查您是否使用了开发人员资料
答案 9 :(得分:1)
为什么长代码而不使用UIToolbar?既然警告仍然存在?
UIToolbar适用于任何iOS版本,这是我的示例代码
UIToolbar *doneToolbar = [[UIToolbar alloc] initWithFrame:(CGRect){0, 0, 50, 50}]; // Create and init
doneToolbar.barStyle = UIBarStyleBlackTranslucent; // Specify the preferred barStyle
doneToolbar.items = @[
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
[[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(doneEditAction)] // Add your target action
]; // Define items -- you can add more
yourField.inputAccessoryView = doneToolbar; // Now add toolbar to your field's inputview and run
[doneToolbar sizeToFit]; // call this to auto fit to the view
- (void)doneEditAction {
[self.view endEditing:YES];
}
答案 10 :(得分:1)
在iOS应用中找不到与OS X相连的数字小键盘。因此,您只需在模拟器中取消选中“连接硬件键盘”选项,就可以通过以下路径进行测试:
Simulator -> Hardware -> Keyboard -> Connect Hardware Keyboard
这将解决上述问题。
我认为您也应该看到以下链接。它说这是
bug
XCode
在该论坛帖子线程的末尾!
答案 11 :(得分:0)
也许你应该重置按钮的框架,我也遇到了一些问题,并且像这样用nslog查看键盘:
iOS8上:
"<UIInputSetContainerView: 0x7fef0364b0d0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7fef0364b1e0>>"
before8:
"<UIPeripheralHostView: 0x11393c860; frame = (0 352; 320 216); autoresizesSubviews = NO; layer = <CALayer: 0x11393ca10>>"
答案 12 :(得分:0)
我在使用 Flutter 时遇到了这个问题, 当我点击我的输入时,键盘没有出现,我通过将 Form 小部件升级到 stateFull 的小部件来修复它。
但警告仍然存在。
答案 13 :(得分:-1)
好的,这是一个简单的解决方案,可以帮助您完成工作。当我遇到类似错误时,按钮在iOS 9,iOS 8及以下版本的应用程序中显示和工作。在运行应用程序并通过“查看的层次结构”查看后,可以观察到它。 (即,当应用程序在设备上运行并在Storyboard中检查您的视图时,单击“调试区域”栏中的“查看层次结构”图标),键盘将显示在iOS中的不同窗口上9与iOS 8及以下版本相比,必须加以考虑。 的 addButtonToKeyboard 强>
- (id)addButtonToKeyboard
{
if (!doneButton)
{
// create custom button
UIButton * doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
doneButton.frame = CGRectMake(-2, 163, 106, 53);
doneButton.adjustsImageWhenHighlighted = NO;
[doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
[doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
[doneButton addTarget:self action:@selector(saveNewLead:) forControlEvents:UIControlEventTouchUpInside];
}
NSArray *windows = [[UIApplication sharedApplication] windows];
//Check to see if running below iOS 9,then return the second window which bears the keyboard
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 9.0) {
return windows[windows.count - 2];
}
else {
UIWindow* keyboardWithDoneButtonWindow = [ windows lastObject];
return keyboardWithDoneButtonWindow;
}
}
如果你愿意,这就是你可以从键盘上 removeKeyboardButton 的方法。
- (void)removeKeyboardButton {
id windowTemp = [self addButtonToKeyboard];
if (windowTemp) {
for (UIView *doneButton in [windowTemp subviews]) {
if ([doneButton isKindOfClass:[UIButton class]]) {
[doneButton setHidden:TRUE];
}
}
}
}