アプリのスライダー コントロールに 10 個の異なるページが組み込まれています。これらのページは、ストーリーボードを使用して設定されています。
各ページの唯一の違いは、リッチ テキストを表示するための異なる Web ビューと、背景として使用される異なる画像です。
10 ページすべてに対して 1 つのビュー コントローラーを設定し、コンストラクターでいくつかのフラグを設定することは可能ですか? もしそうなら、これはどのように見えますか?
ありがとう、
ルイス。
アプリのスライダー コントロールに 10 個の異なるページが組み込まれています。これらのページは、ストーリーボードを使用して設定されています。
各ページの唯一の違いは、リッチ テキストを表示するための異なる Web ビューと、背景として使用される異なる画像です。
10 ページすべてに対して 1 つのビュー コントローラーを設定し、コンストラクターでいくつかのフラグを設定することは可能ですか? もしそうなら、これはどのように見えますか?
ありがとう、
ルイス。
MyViewController など、UIViewController のサブクラスを作成できます。次に、.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];
View Controllerのデータソースを定義するのが最善の方法だと思います。このデータ ソースには、次のようなインターフェイスがあります。
@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;
次に、View Controller は、必要に応じて 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];
}
等