状态消息损坏了我的 iPhone 应用程序中的主窗口

Posted

技术标签:

【中文标题】状态消息损坏了我的 iPhone 应用程序中的主窗口【英文标题】:status message corrupts main window in my iPhone app 【发布时间】:2012-10-13 14:45:06 【问题描述】:

在我的 ios 应用程序中,当按下按钮时会启动一个事件,并在屏幕底部显示一条状态消息,通知用户操作成功或失败。

状态信息出现和消失,代码如下。

这个显示消息

- (void) showMessage:(NSString*)text

        CGRect frame = [[self view] frame];

        if(statusView == nil)
        
            messageViewWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, frame.size.height-29,
                                                       frame.size.width, 0)];


            statusView = [[StatusMessageView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, 0)
                                                             Text:text
                                                 andShowIndicator:NO];
            [messageViewWindow addSubview:statusView];
            [messageViewWindow makeKeyAndVisible];
        

        UILabel *label = [statusView getTextLabel]; 
        UIImageView *imageView = [statusView getBackImageView];

        CGSize stringSize = [text sizeWithFont:[Constants getLabelFont]];
        int xCoordinate = (messageViewWindow.frame.size.width - stringSize.width)/2;

        [UIView beginAnimations:nil context:nil];
        messageViewWindow.frame = CGRectMake(0, frame.size.height-59, frame.size.width, 30);
        statusView.frame = CGRectMake(0, 0, frame.size.width, 30);
        label.frame = CGRectMake(xCoordinate,5,stringSize.width,20);
        imageView.frame = CGRectMake(0, 0, frame.size.width, 30);
        [UIView commitAnimations];  

        [NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(hideMessage) userInfo:nil repeats:NO];


这个隐藏了消息

- (void) hideMessage

    UILabel *label = [statusView getTextLabel]; 
    UIImageView *imageView = [statusView getBackImageView];

    CGRect labelFrame = label.frame;

    [UIView beginAnimations:nil context:nil];
    messageViewWindow.frame = CGRectMake(0, [UIScreen mainScreen].applicationFrame.size.height-29, [UIScreen mainScreen].applicationFrame.size.width, 0);
    statusView.frame = CGRectMake(0, 0, [UIScreen mainScreen].applicationFrame.size.width, 0);  
    label.frame = CGRectMake(labelFrame.origin.x, 0, labelFrame.origin.y, 0);
    imageView.frame = CGRectMake(0, 0, [UIScreen mainScreen].applicationFrame.size.width, 0);
    [UIView commitAnimations];

奇怪的是消息显示并在两秒钟后消失,但是主窗口失去了功能,例如复制和粘贴功能。

您发现我的方法有问题吗?有没有一定的方法,调用“动画”代码?

【问题讨论】:

为什么这么奇怪?您正在将计时器设置为在显示后两秒钟将其隐藏。 @Martol1ni 状态消息显示 2 秒,然后被删除。这很好用。移除后 UIView 出现问题。 【参考方案1】:

由于你写的是[messageViewWindow makeKeyAndVisible];,你必须在hideMessage中写[self.view.window makeKeyAndVisible],让self.view.window再次处理所有的用户交互。

【讨论】:

【参考方案2】: 这是因为您使用UIWindow 来显示您的视图,这不是一个好主意(不建议您自己创建UIWindows,如文档的“概述”段落中所述。李> 此外,您将窗口设置为关键窗口,但在隐藏它时不会在最后恢复标准窗口,因此您以后会遇到事件问题。 最后,你使用过时的 APIs 来制作动画,因为 iOS4 已经过时了(我猜你没有为 iOS3 或更早版本编写代码),你真的应该使用已经引入 3 个 iOS 版本的新 APIs现在以前。此外,它将避免为此创建NSTimer 的开销。

所以你的代码可以变成:

- (void) showMessage:(NSString*)text

    CGSize sz = self.view.window.frame.size;
    CGRect hiddenFrame = CGRectMake(0, sz.height-29, sz.width, 0);

    if(statusView == nil)
    
        statusView = [[StatusMessageView alloc] initWithFrame:hiddenFrame
                                                         text:text
                                             andShowIndicator:NO];
        [self.window addSubview:statusView];
    

    UILabel *label = [statusView getTextLabel]; 
    UIImageView *imageView = [statusView getBackImageView];

    CGSize stringSize = [text sizeWithFont:[Constants getLabelFont]];
    int xCoordinate = (sz.width - stringSize.width)/2;
    label.frame = CGRectMake(xCoordinate,5,stringSize.width,20);
    imageView.frame = CGRectMake(0, 0, frame.size.width, 30);

    [UIView animateWithDuration:1.f animations:^
        statusView.frame = CGRectMake(0, sz.height-59, frame.size.width, 30);
     completion:^
        // When show animation is done, schedule the start of the hide animation with a delay of 2 seconds
        [UIView animateWithDuration:1.f delay:2.f options:0 animation:^
            statusView.frame = hiddenFrame;
         completion:nil];
    ];

【讨论】:

小挑剔:尽管不鼓励使用它们,但 beginAnimationscommitAnimations 并没有被弃用(至少从 iOS 6 开始)。来自文档“在 iOS 4.0 及更高版本中不鼓励使用此方法。您应该使用基于块的动画方法来指定您的动画。”

以上是关于状态消息损坏了我的 iPhone 应用程序中的主窗口的主要内容,如果未能解决你的问题,请参考以下文章

iOS核心数据损坏?

我的析构函数是不是给了我这个错误:*** `./main' 中的错误:双重释放或损坏(fasttop):?

iPhone 13发布前迎来坏消息,摩托车会损坏手机相机?

iphone App中的内存泄漏

iTunes Connect 中的 iPhone 应用发布日期选项 [关闭]

Fuse lib示例删除了我的主文件夹