【问题标题】:UIButton click not working if subview of UIWIndow如果 UIWINdow 的子视图,UIButton 单击不起作用
【发布时间】:2017-03-27 08:09:53
【问题描述】:

我正在创建一个 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");
}

【问题讨论】:

  • 我认为您必须先使用 Uiview,然后在窗口的上层添加。 uiview 应该添加按钮。试试这个
  • 不要使用层loginButton.layer.zPosition = 5;
  • 使用bringSubViewFront,如果不是。
  • [窗口 setUserInteractionEnabled:YES];我认为这可以工作。并始终添加上层 uibutton
  • 你在使用故事板吗?

标签: ios objective-c uibutton


【解决方案1】:

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

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

以下是一些建议:

但是如果你使用 UINavigationController 使用:

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

如果你在使用 UITabBarController 使用:

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

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

[self.window addSubview:aView];

希望对你有帮助...

【讨论】:

  • 我正在开发一个库,在 AppDelegate 中唯一的调用将是启动该库。使用我的库的开发人员将从 AppDelegate 初始化它,我必须添加按钮,无论它是什么类型的控制器。
  • 也许您可以为您的用户提供一个 API,例如 showButtonInView:(UIView)view 并让您的用户选择显示按钮的容器
  • 我需要所有视图控制器顶部的按钮。
  • 你得到这个解决方案了吗@AravindGS
  • @Abhishek .. 是的。我将其添加为答案
【解决方案2】:

而不是将您的按钮添加为窗口的子视图添加此 那么你的按钮就会得到动作。 [appWindow.rootViewController.view addSubview:loginButton];

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

如果您希望它位于每个 viewController 的顶部,请检查 UINavigationController 是否不是 initialViewController,然后创建一个您自己的 NavigationController 并将其设置为 initialContoller。这将使您的按钮在整个应用程序中可见(直到用户自己呈现任何其他 VC)

【讨论】:

  • 这种工作.. 但我需要按钮在所有视图中都存在。如果我添加一个模态视图控制器,那么按钮将不再可见。
  • 您可以做一件事,为该按钮设置一个标签,然后使用 [window bringSubviewToFront:[window viewWithTag:1523]] 将该按钮置于前面;
  • 仍然无法工作.. 考虑 rootview 控制器是 UINavigationController。当您将按钮作为子视图添加到导航控制器时,在该导航控制器上被推送(显示)的所有视图控制器都将获得该按钮。但是,当您呈现模态控制器时,按钮将位于下方
  • 是的,如果您将 UINavigationController 视为 root,则在 NavigationController 的 topVC 中添加以下代码。 UIWindow *window = [[[UIApplication sharedApplication] delegate] window]; [窗口bringSubviewToFront:[窗口viewWithTag:1523]];
  • 我正在构建一个库。根视图控制器可以根据开发人员使用我的库的需要是任何东西。我需要一个通用的解决方案。 rootview 控制器可以是标签栏控制器、拆分视图控制器、页面控制器任何东西
【解决方案3】:
UIWindow *appWindow = [UIApplication sharedApplication].keyWindow;
[appWindow addSubview:view];

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多