来自 UIWindow 的子视图并将其发送回 UIwindow
Posted
技术标签:
【中文标题】来自 UIWindow 的子视图并将其发送回 UIwindow【英文标题】:subview from UIWindow and sending it back to UIwindow 【发布时间】:2013-02-20 06:30:58 【问题描述】:我有一个UIWebView
加载了 div,充当编辑器来编写。现在我在UIWindow
上添加UIWebView
作为子视图,以将框架设置为全屏并隐藏UIKeyboard
,但是在某些按钮方法中,我需要从UIWindow
获取UIWebview
并发送它回UIKeyboard
。这是我的代码不起作用:
keyboardWindowFrame= nil;
for (UIWindow *testWindow in [[UIApplication sharedApplication] windows])
if (![[testWindow class] isEqual:[UIWindow class]])
keyboardWindowFrame = testWindow;
[webViewForEditing setFrame:CGRectMake(5, 63, 310, 400)];
[webViewForEditing.scrollView setContentSize:CGSizeMake(310, 400)];
[keyboardWindowFrame addSubview:webViewForEditing];
break;
- (IBAction)keyboardButtonSelected:(id)sender
[keyboardWindowFrame sendSubviewToBack:webViewForEditing]; //need to send UIWebView back to UIWindow so i can write
【问题讨论】:
你的意图是什么?描述不是很清楚(至少对我来说)。顺便说一句,ios 应用程序中通常只有一个窗口。 @Matthias:我需要从窗口中获取 UIWebview,这是之前添加的,需要在键盘后面发送。 【参考方案1】:我想我正在尝试和你做同样的事情,所以虽然你的问题不是特别清楚,但希望我的回答会有所帮助。
您似乎有一个视图“webViewForEditing”,您想将其添加到键盘前面。当您单击一个按钮时,您希望再次将此视图放在键盘后面。
我也尝试过使用 sendSubViewToBack 代码,但没有任何乐趣。
最后虽然我设法让它工作了:
[[self view] exchangeSubviewAtIndex: withSubviewAtIndex: ];
(感谢 Sunny 改编自一个问题 here)
我使用下面的代码在 UIView 和键盘之间切换:
- (IBAction)toggleButtonPressed:(id)sender
UIWindow * window = [UIApplication sharedApplication].windows.lastObject;
if (window.subviews.count == 1)
[window addSubview:_menuView];
else
[window exchangeSubviewAtIndex: 0 withSubviewAtIndex: 1];
我只使用两个视图(_menuView 和键盘),这意味着我检查我的窗口必须有多少子视图以确保我只添加一次 _menuView。
然后很容易交换两种观点。
即使您的窗口中有更多子视图,我相信您也可以使用它的修改版本。只要您的其他视图都没有改变位置,那么交换它们将始终切换相同的两个视图。
注意:顺便说一句。我不确定如果在键盘不是第一响应者时调用此代码是否有效。我使用窗口中的最后一个对象获取 Window 的变量,如果它已成为第一响应者,则它始终是键盘。它可能需要调整以使其在其他时间正常工作。
【讨论】:
【参考方案2】:在研究这个问题时,我制定了另一个更有说服力的答案:
将你想要的视图添加到包含键盘视图的窗口视图中:
@interface BViewController : UIViewController
UIWindow * window;
// Add the code when the keyboard is showing to ensure it is added while we have a keyboard and to make sure it is only added once
-(void) keyboardDidShow: (NSNotification *) notification
window = [UIApplication sharedApplication].windows.lastObject;
if (window.subviews.count == 1)
[window addSubview:_menuView];
[window addSubview:_gameView];
[window addSubview:_stickerView];
[self hideViews];
- (void)hideViews
_menuView.hidden = YES;
_gameView.hidden = YES;
_stickerView.hidden = YES;
现在我们有了 UIWindow 视图,其中包含我们的视图和键盘。它们都被隐藏了,所以我们的键盘出现在前面并且可以输入。
现在使用一个简单的函数来决定将哪个视图带到键盘前:
- (void)bringViewToFront: (UIView *)view
[self hideViews];
view.hidden = NO;
隐藏视图确保我们只有在前面有正确的视图。
我花了很多时间思考如何使用交换功能来前后移动不同的视图。实际上使用隐藏和显示意味着我们可以立即获得我们的视图,并且仍然可以通过隐藏所有视图轻松访问键盘。
【讨论】:
以上是关于来自 UIWindow 的子视图并将其发送回 UIwindow的主要内容,如果未能解决你的问题,请参考以下文章
如果 UIWINdow 的子视图,UIButton 单击不起作用