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

时间:2013-02-20 06:30:59

标签: objective-c uiwebview uiwindow

我有一个UIWebView加载div,充当编辑器来编写。现在我将UIWebView添加为UIWindow上的子视图以将帧设置为全屏并隐藏UIKeyboard,但是在某些按钮方法中,我需要获取UIWebview来自UIWindow并将其发回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
}  

2 个答案:

答案 0 :(得分:0)

我想我正在努力做同样的事情,所以虽然你的问题不是特别清楚,希望我的答案会有所帮助。

您似乎想要添加一个视图'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的变量,如果它是第一个响应者,它总是键盘。它可能需要调整以使其在其他时间工作。

答案 1 :(得分:0)

在制定这个问题时,我提出了另一个更有说服力的答案:

将您想要的视图添加到包含键盘视图的窗口视图:

@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;
}

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

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