UISegmented Controller для загрузки одного представления с несколькими Youtube UIWebViews и другого представления с изображениями - PullRequest
0 голосов
/ 14 декабря 2011

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

В настоящее время у меня есть приложение панели вкладок с четырьмя вкладками. Во второй вкладке (SecondViewController) у меня есть сегментированный контроллер в верхней части, который должен переключаться между «видео» и «изображения». На странице видео должно быть около 5 видео YouTube, загруженных в UIWebView с использованием кода здесь . Представление изображений должно содержать около 5 миниатюр, которые при нажатии открываются в увеличенное изображение. Моя проблема в том, что я испробовал много разных способов сделать это, и ни один из них, похоже, не сработал. Действительно, главное, что я здесь ищу, - это рекомендуемый способ переключения между двумя представлениями с использованием сегментированного контроллера и, если возможно, загрузки представлений из разных файлов (videosView.h / m и imagesView.h / m).

В SecondViewController.m приложение отвечает на UISegmentedController с использованием следующего, хотя я абсолютно не знаю, является ли это даже близко к правильному.

- (IBAction)segmentedControlChanged

{   
    switch (segmentedControl.selectedSegmentIndex)
    {case 0:
            [self.view addSubview:videosView.view];
            [imagesView.view removeFromSuperview];
            NSLog(@"1");
            break;
    case 1:
            [self.view addSubview:imagesView.view];
            [videosView.view removeFromSuperview];
            NSLog(@"2");
            break;
    default:
            break;
    }
}

В videosView.h у меня есть только следующее:

#import <UIKit/UIKit.h>

@interface videosView : UIWebView 
{
}

- (videosView *)initWithStringAsURL:(NSString *)urlString frame:(CGRect)frame;

@end

В videosView.m у меня есть следующее, хотя я получаю предупреждение в строке initWithFrame.

- (videosView *)initWithStringAsURL:(NSString *)urlString frame:(CGRect)frame;
{
    if (self = [super init]) 
    {
        // Create webview with requested frame size
    self = [[UIWebView alloc] initWithFrame:frame];

        // HTML to embed YouTube video
        NSString *youTubeVideoHTML = @"<html><head>\
        <body style=\"margin:0\">\
        <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \
        width=\"%0.0f\" height=\"%0.0f\"></embed>\
        </body></html>";

        // Populate HTML with the URL and requested frame size
        NSString *html = [NSString stringWithFormat:youTubeVideoHTML, urlString, frame.size.width, frame.size.height];

        // Load the html into the webview
        [self loadHTMLString:html baseURL:nil];
    }
    return self;  

}

@end

imagesView сделан, но в нем нет добавленного кода, так как я просто пытаюсь сначала разобраться с видео.

1 Ответ

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

Моя рекомендация:

  1. Используйте один контроллер вида, и контроллер вида должен содержать оба вида.Вы уже делаете это.
  2. Вы по-прежнему можете использовать отдельные файлы (подклассы UIView).
  3. Не используйте addSubview: и removeFromSuperView:, но вместо этого установите для этого представления «контейнера» значение hidden, в зависимости от ситуации.
  4. Кроме того, в методе segmentedControlChanged сделайте вседругие необходимые задачи переключения, такие как отмена открытых соединений URL-адреса и т. д.
  5. Выполните инициализацию веб-содержимого представлений контейнера в viewDidLoad, а не в инициализаторе.Убедитесь, что вы не замораживаете пользовательский интерфейс, а используете асинхронную загрузку.

РЕДАКТИРОВАТЬ: Добавление кода подкласса.

в SecondViewController.h:

#include VideosView.h    
...
@property (nonatomic, retain) VideosView *videoView;

в SecondViewController.m

 -(void)viewDidLoad {  
   self.videosView = [[VideosView alloc] init]; 
   // add to superview etc.
}

Всякий раз, когда вы хотите выполнить определенный код представления, просто вызовите любой метод, определенный вами в VideosView.h, и реализуйте в .m.

[self.videosView playVideo];
...