我正在玩一个简单的测试应用程序,它只循环显示10个图像并将每个图像显示在视图中。用户单击按钮后将显示下一个图像。我遇到的问题是视图永远不会出现(图像或按钮)。当我取出按钮按下子句时,代码运行并显示最后一个图像。 continueRunningScript最初是YES。
@interface ViewController : UIViewController <UIAlertViewDelegate>
{
BOOL continueRunningScript;
UIButton *wrongButton;
UIImageView *imageView;
}
// ...
@end
@implementation ViewController
// ...
- (void) xxx {
for (int i = 0; i<10; i++) {
while (continueRunningScript == NO) {
// Stay here until button is pressed.
}
UIImage *testImg = ... // code to load the image at index i
imageView = [[UIImageView alloc] initWithImage: testImg];
[self.view addSubview:imageView];
wrongButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[wrongButton addTarget:self
action:@selector(incorrectResultButtonPress:)
forControlEvents:UIControlEventTouchUpInside];
[wrongButton setTitle:@"Wrong Result?" forState:UIControlStateNormal];
wrongButton.frame = CGRectMake(80.0, 310.0, 160.0, 40.0);
[self.view addSubview:wrongButton];
continueRunningScript = NO;
[testImg release];
}
[imageView release];
[wrongButton release];
}
// button press handling...
// UIAlertViewDelegate
- (void) alertView: (UIAlertView *)actionSheet clickedButtonAtIndex: (NSInteger)buttonIndex {
// The user clicked one of the Yes/No buttons
if (buttonIndex == 0) // Yes
{
UIAlertView *thankyouAlert = [[UIAlertView alloc] initWithTitle:@"Thank You"
message:@"Thanks for the feedback!"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:nil];
[thankyouAlert show];
// Call performSelector delegate method of NSObject to call class method dismissAlertView
[self performSelector:@selector(dismissAlertView:) withObject:thankyouAlert afterDelay:2];
[thankyouAlert release];
[wrongButton removeFromSuperview];
continueRunningScript = YES;
}
}
// ...
@end
答案 0 :(得分:1)
我假设你没有在后台线程或其他任何事情上这样做。如果你是,那么你应该知道UIKit只是设计用于主线程。
while (continueRunningScript == NO) {
// Stay here until button is pressed.
}
这不会按照你想要的方式工作。它将进入一个无限循环。执行线程不会超过此点来处理任何输入事件,因此该变量永远不会被设置为YES
。
您必须记住,退出方法后,所有用户界面代码都将运行。如果你采用纯粹的,那么你循环遍历所有添加的图像,然后更新用户界面。这就是为什么你只看到最后一张图片 - 其他图片也被添加了,但它们位于最顶层(最后一张)之下。
如果您希望每次用户点击按钮时都显示新图像,那么您应该有一个实例变量来跟踪哪个图像是当前图像,并编写一个方法来更新此变量并显示下一个图片。几乎在所有情况下,如上所述的繁忙循环都是错误的。
此外,您应该知道,每次要显示新图像时都不必添加新的UIImageView
。您只需更新现有图像视图的image
属性即可更改其显示的图像。
答案 1 :(得分:1)
方法'xxx'是否在主线程上运行?如果是这样,罪魁祸首是:
while (continueRunningScript == NO) {
// Stay here until button is pressed.
}
iOS使用事件驱动的体系结构,阻止主线程非常糟糕,就像你在这里一样。您的应用程序将在此处无限循环,并将停止更新UI,并且不会响应任何按下按钮或其他事件。这就是您的视图,图像和按钮没有出现的原因。
您需要考虑如何修改您的应用以适应事件驱动的架构。
答案 2 :(得分:0)
我认为你不需要发布imageView或wrongButton。只要控制器存在,它们可能希望保留。
除此之外,我建议我们需要更多信息。
答案 3 :(得分:0)
UIKit仅在您返回主UI运行循环时绘制内容。您的代码在第一张图像之后和下一张图像之前不会返回,因此永远不会显示第一张图像。
事件也只在主UI运行循环中检测/分派。由于您的代码永远不会从第一个按钮处理程序返回,因此不会检测到后续按钮事件。