OO方法在obj-c中查看控制器类

时间:2012-10-18 10:31:34

标签: objective-c uiviewcontroller constructor

我的应用程序中的滑块控件中内置了10个不同的页面,这些页面是使用故事板设置的。

每个页面的唯一区别是使用不同的Web视图来显示富文本,并使用不同的图像作为背景。

我是否可以为所有10个页面设置一个视图控制器,并在构造函数中设置一些标志,这些标志在加载时会在每个页面上执行,以告诉它显示什么图像和Web视图?如果是这样的话会是什么样的?

谢谢,

路易斯。

2 个答案:

答案 0 :(得分:1)

我认为最好的方法是为视图控制器定义数据源。该数据源具有以下接口,例如:

@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];
}

答案 1 :(得分:1)

您可以创建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];