如果UIWIndow的子视图,UIButton单击不起作用

时间:2017-03-27 08:09:54

标签: ios objective-c uibutton

我正在创建一个iOS库。从AppDelegate启动时,我的库将在屏幕顶部创建一个按钮。

我创建了按钮,它正在显示。但是当我点击时,不会引发目标方法。

这就是我创建按钮并在库中分配其动作的方法

- (void) addLoginButton {
UIWindow *appWindow = [[[UIApplication sharedApplication] delegate] window];
UIButton *loginButton = [UIButton buttonWithType:UIButtonTypeSystem];
[loginButton setFrame:CGRectMake((appWindow.frame.size.width/2)-35, 20, 70, 20)];
[loginButton setBackgroundColor:[UIColor blueColor]];
[loginButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[loginButton setTitle:@"Login" forState:UIControlStateNormal];
[loginButton addTarget:self action:@selector(auLoginClicked) forControlEvents:UIControlEventTouchUpInside];
[appWindow addSubview:loginButton];
if([appWindow.rootViewController isKindOfClass:[UINavigationController class]]) {
    UINavigationController *navCon = (UINavigationController *)(appWindow.rootViewController);
    if (!navCon.navigationBar.isHidden) {
        navCon.navigationBar.layer.zPosition = 0;
    }
}
loginButton.layer.zPosition = 5;
}

- (void) auLoginClicked {
NSLog(@"Hello");
}

3 个答案:

答案 0 :(得分:2)

我复制了你的代码并得到了相同的结果。这真的很奇怪,我还在努力。我确认这是导致结果的故事板,因为我在我的项目中使用你的代码而不使用故事板,它运作正常。

但请不要使用loginButton.layer.zPosition = 5;这不是正确的方式。

以下是一些建议:

但是如果你使用UINavigationController使用:

[self.navigationController.view.window addSubview:aView];

如果您使用UITabBarController使用:

[self.tabBarController.view.window addSubview:aView];

在AppDelegate中,您可以直接将视图分配给窗口。在appDelegate didFinishLaunchingWithOptions方法中使用:

[self.window addSubview:aView];

希望它有所帮助...

答案 1 :(得分:0)

不是将按钮添加为窗口的子视图,而是添加此项 然后你的按钮就会动作。 [appWindow.rootViewController.view addSubview:loginButton];

如果您将视图(按钮)添加为窗口的子视图,则它将无法从用户获取事件。这就是您的按钮无法响应事件的原因。 调试它你会明白:)

如果你想让它在每个viewController的顶部,那么检查UINavigationController是不是initialViewController,然后创建一个你自己的NavigationController并使其成为initialContoller。它将使您的按钮在整个应用程序中可见(直到用户自己呈现任何其他VC)

答案 2 :(得分:0)

UIWindow *appWindow = [UIApplication sharedApplication].keyWindow;
[appWindow addSubview:view];

您只需要获取应用程序的keyWindow并将按钮添加为子视图。您不必设置zPosition