首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自UIWindow的子视图并将其发送回UIwindow

来自UIWindow的子视图并将其发送回UIwindow
EN

Stack Overflow用户
提问于 2013-02-20 14:30:59
回答 2查看 1.9K关注 0票数 0

我有一个加载了div的UIWebView,作为编辑器来编写。现在,我在UIWindow上将UIWebView作为子视图添加,以将帧设置为全屏并隐藏UIKeyboard,但在某些按钮方法中,我需要从UIWindow获取UIWebview并将其发送回UIKeyboard。下面是我的代码,它不能工作:

代码语言:javascript
复制
  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
}  
EN

回答 2

Stack Overflow用户

发布于 2014-06-26 06:13:44

我想我正在试着做和你一样的事情,所以尽管你的问题不是特别清楚,希望我的答案能有所帮助。

您似乎有一个视图'webViewForEditing‘,您想要添加它并将它放在键盘前面。当您单击一个按钮时,您希望再次将此视图放在键盘后面。

我也尝试过使用sendSubViewToBack代码,但并不开心。

最后,我设法让它运行起来,使用的是:

代码语言:javascript
复制
[[self view] exchangeSubviewAtIndex:  withSubviewAtIndex: ];

(功劳归功于桑尼,它改编自问题here)

我使用下面的代码在UIView和键盘之间切换:

代码语言:javascript
复制
- (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的变量,如果它被设置为first responder,那么它始终是键盘。它可能需要调整以使其在其他时间工作。

票数 0
EN

Stack Overflow用户

发布于 2014-06-26 12:47:40

在写这篇文章的时候,我提出了另一个更有说服力的答案:

将所需的视图添加到包含键盘视图的窗口视图中:

代码语言:javascript
复制
@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视图,其中包含视图和键盘。它们都是隐藏的,所以我们的键盘出现在前面,可以在上面打字。

现在使用一个简单的函数来决定在键盘前显示哪个视图:

代码语言:javascript
复制
- (void)bringViewToFront: (UIView *)view {

    [self hideViews];
    view.hidden = NO;
}

隐藏视图可以确保我们只有在前面才有正确的视图。

我花了很多时间思考如何使用交换函数来回移动不同的视图。实际上,使用隐藏和显示意味着我们可以立即获得视图,并且仍然可以通过隐藏所有视图轻松访问键盘。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14973623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档