2012-09-30 54 views
0

当用户点击iPhone应用程序页面中的图像时,我想首先显示自定义弹出窗口(这是用户消息说“正在处理您的请求” ),“开始”图像触摸处理之前。但是,不知何故,处理开始(甚至没有显示弹出窗口,尽管我已经编写了代码来在处理代码之前显示弹出窗口),但几乎只会结束&,只有弹出窗口才会显示。你能帮忙吗?CocoaTouch - iPhone应用程序 - 执行前继续显示对话框

这是代码片段:

-(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(其应显示弹出/对话框)“第一”,“然后仅”正在呼叫,其处理方法触摸。但处理触摸的方法首先开始执行&对话框仅在处理方法结束时出现,因此它破坏了目的!

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

我如何“任务”认为iOS的“第一”显示“之前”开始处理触摸事件的用户对话框?

+0

你能解释为什么特定的顺序很重要吗?典型的设计启动了后台工作,并在运行循环的相同轮回中呈现“处理它”UI状态。这两件事实际上都是在应用程序返回时开始发生的,并且大部分时间都是人们想要的。你的processTouch代码中会发生什么,以破坏用户界面的变化? – danh

+0

处理代码需要很长时间才会出现问题,并且您希望向用户显示一条警告以等待? –

回答

2

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

实现你想要的标准模式是使用委托一旦它被绘制,它有视图回调到代表。 Apple在UIAlert类中使用这种模式,你应该做的就是让你的代码使用它来代替你的自定义视图,然后修改你的自定义视图来获得委托并在它显示后回调。

我强烈建议您阅读runloops,以便您了解事件处理和延迟处理等事情。

+0

谢谢你,路易斯。这给了我一个不同的视角来思考问题!让我试试看。 – Jean

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]; 
+2

请不要这样做。不起作用。第一个选项会睡觉你正在的线程。您可能是在主线程中,所以效果只会引入用户可见的0.5秒UI冻结,并且仍然在视图显示之前运行所有内容。如果您的计时猜测已关闭(例如,如果在加载计时器和启动计时器之间的1.0秒内进入电话),则第二种情况会引入竞争状况,导致出现奇怪的错误和崩溃。只需设计您的课程以正确使用授权。 –

+0

既然你重新排序了你的文章,我上面所说的所有东西都是真的,除非第二个代码是绝对不会工作的代码,你提供的第一个解决方案是有时会显示工作的第一个解决方案,由于它是一个竞赛条件而崩溃。 –

+0

你说这会导致一些问题,而不是它不会工作, 我并不是真的想争辩或冒犯你,但我认为如果你正在谈论时间赛跑似乎不是一个大问题关于设置始终相同的时间间隔。老实说,我不确定如果你在定时器设定的时间间隔内接到电话以延迟动作,它会如何反应。 我肯定希望更多地了解你所建议的答案,我了解代表团,但我不确定你在这里要做什么,尽管这不是我的问题。不管怎么说,谢谢你的建议。 –

相关问题