UI分段控制器使用一些Youtube UIWebView加载一个视图,使用Images加载另一个视图

时间:2011-12-13 21:41:43

标签: iphone objective-c ios uiwebview uisegmentedcontrol

很抱歉这个问题很长,但我已经坚持了几天,并且已经用尽所有其他帮助了。

目前,我有一个带有四个标签的标签栏应用程序。在第二个选项卡(SecondViewController)中,我在顶部有一个分段控制器,可以在“视频”和“图像”之间切换。视频页面应该使用代码here在UIWebView中加载大约5个youtube视频。图像视图应包含大约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 :(得分:0)

我的建议:

  1. 使用一个视图控制器并让视图控制器包含两个视图。你已经这样做了。
  2. 您仍然可以使用单独的文件(UIView的子类)。
  3. 请勿使用addSubview:removeFromSuperView:,而应将这些“容器”视图设置为hidden
  4. 此外,在segmentedControlChanged方法中,执行所有其他必要的切换任务,例如取消打开的URL连接等。
  5. viewDidLoad而不是初始化程序中初始化容器视图的Web内容。确保不冻结UI但使用异步加载。
  6. 编辑:添加子类代码。

    在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];