Three20 TTWebController に「閉じる」ボタンを追加 - iPhone
-
26-09-2019 - |
質問
次のコードを使用して、TTWebController をモーダル ビューとして表示しています。
TTNavigator* navigator = [TTNavigator navigator];
TTURLMap* map = navigator.URLMap;
[map from:@"*" toModalViewController:[TTWebController class]];
TTWebController に「閉じる」ボタンがないことを除いて、すべてがうまく機能します。通常、これを横から押して「戻る」ボタンを与えることはわかっていますが、実際の Three20 コードを掘り下げずに「閉じる」ボタンを追加する方法はありますか?
アップデート:
以下は、テキストを作成し、モーダル ビューを画面にプッシュするために使用しているコードです。「YourUrlHere」の代わりに、クリックされた URL を動的に送信したいと考えています。
CGRect frame = CGRectMake(100, 100, 200, 200);
TTStyledTextLabel* label = [[[TTStyledTextLabel alloc] initWithFrame:frame] autorelease];
NSString* labelText = @"http://www.yahoo.com http://www.google.com http://www.test.com";
label.text = [TTStyledText textFromXHTML:labelText lineBreaks:NO URLs:YES];
[self.view addSubview:label];
TTNavigator* navigator = [TTNavigator navigator];
TTURLMap* map = navigator.URLMap;
myWebView *newViewController = [[myWebView alloc] initWithNibName:@"TTStyledTextLabelWebView" bundle:nil incomingURL:[NSString stringWithString:@"http://www.YourUrlHere.com"]];
[map from:@"*" toModalViewController:[newViewController class]];
解決
おそらく、実際に必要なのは、TTWebController を継承するか、TTWebController を含む独自のビュー コントローラーです。未加工の代わりにそれを作成してマッピングする TTWebController
, 、ボタンを好きな場所に配置し、内側のタッチアップを配線します。 [self dismissModalViewControllerAnimated:YES];
それでうまくいくはずです。
編集:
これで、次のタイプのカスタム Web ビューが完成しました。 myWebView
から継承すると仮定しています TTWebController
. 。それは良い。余談ですが、クラスを取得するためだけに新しいインスタンスを初期化する必要はありません。 [myWebView class]
クラスメッセージはインスタンスではなくクラスにあるためです。
ただし、xib を使用して新しいインスタンスを作成することに決めたとしても、TTNavigator が同じ方法でコントローラー インスタンスをインスタンス化するとは思いません。代わりに、このコンストラクター (TTWebController.m から抽出) で起動すると思います。
- (id)initWithNavigatorURL:(NSURL*)URL query:(NSDictionary*)query {
if (self = [self init]) {
NSURLRequest* request = [query objectForKey:@"request"];
if (request) {
[self openRequest:request];
} else {
[self openURL:URL];
}
}
return self;
}
したがって、子実装では、次のようにこの実装のカスタマイズされたバージョンを提供できます。
- (id)initWithNavigatorURL:(NSURL*)URL query:(NSDictionary*)query {
if (self = [super initWithNavigatorURL:URL query:query]) {
// code that creates a button and puts it somewhere
}
return self;
}
私はそれをテストしていませんが、そうでない場合は実際に何をしているのか見てみたいと思います。(three20 とは異なり、私のように) xib を好む場合は、それをロードする追加の手順を実行する必要があります。私のユーティリティ フレームワークには、これに役立つカテゴリがあります。
NSBundle+LoadNibView.h
#import <Foundation/Foundation.h>
@interface NSBundle(LoadNibView)
+ (id) loadNibView:(NSString*)className;
@end
NSBundle+LoadNibView.m
#import "NSBundle+LoadNibView.h"
@implementation NSBundle(LoadNibView)
+ (id) loadNibView:(NSString*)className
{
return [[[NSBundle mainBundle] loadNibNamed:className owner:nil options:nil] objectAtIndex:0];
}
@end
の objectAtIndex
その理由は、内部にビューが 1 つしかない場合でも、すべての xib に配列が含まれるためです。これは、xib の最初の UIView を返すだけです。