UIWindow addSubview 处理事件

Posted

技术标签:

【中文标题】UIWindow addSubview 处理事件【英文标题】:UIWindow addSubview handle events 【发布时间】:2016-08-30 05:47:37 【问题描述】:

我想通过UIViewController 构建一个自定义警报,并将其视图作为子视图添加到当前窗口。视图显示得很好,但我无法处理任何触摸事件。

我已经尝试了很多次向这个视图控制器添加一个按钮并添加一个目标。我还尝试添加UITapGestureRecognizer 并将视图的userInteractionEnabled 设置为true,但即使我清除了所有子视图,这也失败了。

我错过了什么吗?

代码如下:

CustomAlert 视图控制器:

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.view.backgroundColor = [UIColor clearColor];

    backgroundView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    backgroundView.backgroundColor = [UIColor blackColor];
    backgroundView.alpha = 0.5;
    [self.view addSubview:backgroundView];


    backImage = [[UIImageView alloc]initWithFrame:CGRectMake((self.view.frame.size.width - 300) / 2, (self.view.frame.size.height - 250) / 2, 300, 250)];

    backImage.image = [UIImage imageNamed:@"AlertBackground"];
    [self.view addSubview:backImage];

    confirmButton = [[UIButton alloc]initWithFrame:CGRectMake( backImage.frame.origin.x + 100 , backImage.frame.origin.y + 250 - 40, 100, 26)];
    [self.view addSubview:confirmButton];
    [confirmButton addTarget:self action:@selector(confirmButtonClick:) forControlEvents:UIControlEventTouchUpInside];
    confirmButton.backgroundColor = [UIColor redColor];
    [confirmButton setTitle:@"click me" forState:UIControlStateNormal];


-(void)confirmButtonClick:(UIButton*)sender

    [self.view removeFromSuperview];


-(void)show
    UIWindow * window = (UIWindow*)[UIApplication sharedApplication].keyWindow;
    [window addSubview:self.view];

方法调用自定义提醒:

CustomAlert * alert = [[CustomAlert alloc]init];
[alert show];

【问题讨论】:

你能显示你正在使用的代码吗? 请出示您的代码,以便您理解您在做什么。 @Paulw11 谢谢。我已经戴上了 @Abha 感谢您的帮助 @Castiel:问题是未处理 CustomAlert Viewcontroller。你应该在addSubview之前addChildViewController 【参考方案1】:

尝试用这些重写你的 -show 方法

UIWindow * window = (UIWindow*)[UIApplication sharedApplication].keyWindow;
[window.rootViewController.view addSubview:self.view];

更新: 如果以前没有帮助,请尝试覆盖

-(void)show
    UIWindow * window = (UIWindow*)[UIApplication sharedApplication].keyWindow;

    [window.rootViewController addChildViewController:self];
    [window.rootViewController.view addSubview:self.view];
    [self didMoveToParentViewController:window.rootViewController];

这三种方法建立了父子关系。

【讨论】:

感谢您的帮助。我试过这个。它运作良好。昨天我将代码更改为只使用 uiview 而不是 uiviewcontroller。也很好。

以上是关于UIWindow addSubview 处理事件的主要内容,如果未能解决你的问题,请参考以下文章

UIWindow 和 UIView addSubview 问题

UIWindow addSubview 上的偏移量

将视图控制器添加到 uiwindow addsubview

Objective-C中的rootViewController和addSubview?

UIWINDOW 子视图上的 UIAccessibility

在 iOS 8.3 中向 UIWindow 添加子视图