Только последнее изображение отображается на iPhone - PullRequest
0 голосов
/ 13 декабря 2011

Я играю с простым тестовым приложением, которое просто просматривает 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 ]

1 голос
/ 13 декабря 2011

Я предполагаю, что вы не делаете это в фоновом потоке или чем-то еще.Если да, то вы должны знать, что UIKit предназначен для использования только из основного потока.

while (continueRunningScript == NO) {
    // Stay here until button is pressed.
}

Это не будет работать так, как вы этого хотите.Это войдет в бесконечный цикл.Поток выполнения не будет проходить дальше этой точки для обработки любых входных событий, так что переменная никогда не получит шанса быть установленной на YES.

. Вы должны помнить, что весь код пользовательского интерфейса будетзапустить после выхода из вашего метода.Если вы убираете чистое, то вы просматриваете все добавленные изображения: , затем , пользовательский интерфейс обновляется.Вот почему вы видите только последнее изображение - остальные были добавлены, но они находятся под самым верхним (последним) изображением.

Если вы хотите, чтобы новое изображение отображалось каждый раз, когда пользователь нажимает кнопку, тогда вы должны иметь переменную экземпляра, которая отслеживает, какое изображение является текущим, и написать метод, чтобы обновить эту переменную и показать следующее изображение.Почти во всех случаях занятый цикл, подобный приведенному выше, является неправильным.

Кроме того, вы должны знать, что вам не нужно добавлять новый UIImageView каждый раз, когда вы хотите отобразить новое изображение.Вы можете просто обновить свойство image для существующего представления изображения, чтобы изменить отображаемое изображение.

1 голос
/ 13 декабря 2011

Работает ли метод 'xxx' в главном потоке? Если это так, виновник:

 while (continueRunningScript == NO) {
        // Stay here until button is pressed.
    }

iOS использует архитектуру, управляемую событиями, и это очень плохая практика - блокировать основной поток, как вы делаете здесь. Ваше приложение зациклится здесь бесконечно, перестанет обновлять пользовательский интерфейс и не будет реагировать ни на какие нажатия кнопок или другие события. Вот почему ваш вид, изображение и кнопка не отображаются.

Вам нужно подумать о том, как вы можете изменить свое приложение, чтобы оно соответствовало архитектуре, управляемой событиями.

0 голосов
/ 14 декабря 2011

UIKit рисует вещи только когда вы возвращаетесь в основной цикл выполнения пользовательского интерфейса. Ваш код не возвращается после первого изображения и до следующего, поэтому первое изображение никогда не отображается.

События также обнаруживаются / отправляются только в главном цикле выполнения пользовательского интерфейса. Поскольку ваш код никогда не возвращается из обработчика первой кнопки, последующие события кнопок не будут обнаружены.

0 голосов
/ 13 декабря 2011

Я не думаю, что вам нужно выпускать imageView или неправильную кнопку.Они, вероятно, хотят быть сохраненными до тех пор, пока существует контроллер.

Помимо этого предположения, я бы посоветовал нам получить больше информации.

...