0

当用户点击 iPhone App 页面中的图像时,我想首先显示一个自定义弹出窗口(这是一条用户消息,说“正在处理您的请求”),“在”开始处理图像触摸之前. 但是,不知何故,处理开始了(甚至没有显示弹出窗口,尽管我已经编写了代码以在处理代码“之前”显示弹出窗口)并且几乎结束,然后才显示弹出窗口。你能帮忙吗?

这是代码片段:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    int emotionChosen = -1;
    [self showUserNote:msg];
    ...
    ...
    // This then calls a method to process the touch event
    ...
    ...
}

-(void) showUserNote:(NSString *)note {

    if ((self.viewCtrlrUserNote == nil) || (self.viewCtrlrUserNote == NULL)) {
        self.viewCtrlrUserNote = (ViewController_NoteToUser *) [((com_AppDelegate *) [[UIApplication sharedApplication] delegate]).storyboard instantiateViewControllerWithIdentifier:kNameViewCtrlrUserNote];
    }
    [self.viewCtrlrUserNote.view setFrame:CGRectMake(70.0,150.0,170.0,170.0)];
    [self.viewCtrlrUserNote initializeViewWithNote:note];
    [self.view addSubview:self.viewCtrlrUserNote.view];
    [self.view bringSubviewToFront:self.viewCtrlrUserNote.view];
}

尽管“首先”调用了 showUserNote(应该显示弹出/对话框),但“然后才”调用了处理触摸的方法。但是处理触摸的方法首先开始执行&对话框只出现在处理方法的末尾附近,&所以它破坏了它的目的!

我的开发环境:XCode 4.3.3、iPad、iOS 5

我如何“强制”iOS“首先”在“开始”处理触摸事件之前显示用户对话框?

4

2 回答 2

2

绘图和 UI 命令在 CocoaTouch 中通常不同步(或者实际上,在任何使用 3D 加速和合成的现代图形 API 中)。当您完成所有工作时,-showUserNote:您将命令排队到视图子系统以在下次处理事件时执行所有这些操作,而不是实际执行它们。

实现您想要的标准模式是使用委托,一旦绘制,它就会将视图回调到委托中。Apple 在 UIAlert 类中使用了这种模式,你应该做的是让你的代码使用它而不是你的自定义视图来工作,然后修改你的自定义视图以拥有一个委托并在它显示后回调它。

我强烈建议您阅读runloops,以便您了解事件处理和延迟处理之类的东西。

于 2012-09-30T17:37:20.080 回答
0

我会尝试将对话后要运行的代码捆绑到一个单独的方法中,并使用 NSTimer 调用它(通过 // 之后检查代码来检查对话框是否正常工作也是一个好主意)像这样

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(myTouchEvent) userInfo:nil repeats:NO];

其中 myTouchEvent 是您要创建的方法。

@Lois Bergarg 指出这可能行不通,这是我的第一个想法....

  NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.5];
  [NSThread sleepUntilDate:future];
于 2012-09-30T17:35:57.593 回答