仅在iPhone上显示最后一张图像

时间:2011-12-13 19:20:04

标签: iphone objective-c xcode uiimageview uibutton

我正在玩一个简单的测试应用程序,它只循环显示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

4 个答案:

答案 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运行循环中检测/分派。由于您的代码永远不会从第一个按钮处理程序返回,因此不会检测到后续按钮事件。