我在我的应用程序的滑块控件中内置了 10 个不同的页面,这些页面是使用故事板设置的。
每个页面的唯一区别是使用不同的 Web 视图来显示富文本,并使用不同的图像作为背景。
我是否可以为所有 10 个页面设置一个视图控制器,并在构造函数中设置一些标志,这些标志将在每个页面加载时执行,以告诉它要显示什么图像和 Web 视图?如果是这样,这会是什么样子?
谢谢,
刘易斯。
我在我的应用程序的滑块控件中内置了 10 个不同的页面,这些页面是使用故事板设置的。
每个页面的唯一区别是使用不同的 Web 视图来显示富文本,并使用不同的图像作为背景。
我是否可以为所有 10 个页面设置一个视图控制器,并在构造函数中设置一些标志,这些标志将在每个页面加载时执行,以告诉它要显示什么图像和 Web 视图?如果是这样,这会是什么样子?
谢谢,
刘易斯。
我认为最好的方法是为您的视图控制器定义一个数据源。该数据源将具有以下接口,例如:
@protocol MyVCDataSource
- (NSUInteger)numberOfPages;
- (NSString*)htmlContentForPageIndex:(NSUInteger)index;
- (NSString*)backgroundForPageIndex:(NSUInteger)index;
@end
您将为视图控制器提供一个名为的成员,该成员datasource
将在initWithDatasource
方法中初始化:
@interface MyVC : UIViewController
...
@property (nonatomic, weak) id<MyVCDataSource> datasource;
- (id)initWithDatasource:(id<MyVCDataSource>)ds;
然后,您的视图控制器会在需要时向数据源询问 HTML 数据或背景文件名:
- (void)viewDidLoad {
self.view.backgroundColor = GET_BACKGROUND_FROM_STRING([self.datasource backgroundForPageIndex:self.currentIndex]);
[self.webView loadHTMLString: [self.datasource htmlContentForPageIndex:self.currentIndex]];
....
}
我假设协议只返回字符串,但实际上你可以让它返回你需要的东西(例如,图像、颜色、URL),这完全取决于你的类的内部结构。
最后,您的数据源对象可以是任何对象(甚至是您的MyVC
实例),并通过索引到数组中返回其数据:
- (NSString*)htmlContentForPageIndex:(NSUInteger)index {
return [self.htmlPages objectAtIndex:index];
}
等等
您可以创建 UIViewController 的子类,例如 MyViewController。然后将您的 .h 文件替换为:
#import <UIKit/UIKit.h>
@interface MyViewController : UIViewController
@property (nonatomic, strong) UIWebView *myWebView;
@property (nonatomic, strong) UIImageView *myImageView;
- (id)initWithURLString:(NSString *)urlString image:(NSString *)imageName;
@end
和你的 .m 文件:
#import "MyViewController.h"
@interface MyViewController ()
@end
@implementation MyViewController
@synthesize myWebView = _myWebView;
@synthesize myImageView = _myImageView;
- (id)initWithURLString:(NSString *)urlString image:(NSString *)imageName
{
self = [super init];
if (self) {
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
_myWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
[_myWebView loadRequest:urlRequest];
_myImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];
_myImageView.frame = CGRectMake(0, 400, 60, 60);
}
return self;
}
@end
然后只需创建 UIViewController 子类的实例:
MyViewController *vCon = [[MyViewController alloc] initWithURLString:someURLString image:imageName];