Adicionando um botão "Fechar" ao Three20 TTWebController - iPhone
-
26-09-2019 - |
Pergunta
Estou apresentando um TTWebController como uma visualização modal usando este código:
TTNavigator* navigator = [TTNavigator navigator];
TTURLMap* map = navigator.URLMap;
[map from:@"*" toModalViewController:[TTWebController class]];
Tudo funciona muito bem, exceto que não há botão "fechar" no TTWebController. Eu sei que isso geralmente é empurrado do lado e recebe um botão "traseiro", mas existe uma maneira de adicionar um botão "fechar" sem cavar o código três20 reais?
Atualizar:
Aqui está o código que estou usando para criar o texto e, em seguida, empurre a exibição modal na tela. Quero enviar dinamicamente qualquer que o URL seja clicado, no lugar de "Yoururlhere".
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]];
Solução
Provavelmente, o que você realmente deseja é o seu próprio controlador de visualização, que herda ou contém um ttwebcontroller. Criar e mapear para isso em vez do bruto TTWebController
, coloque o botão onde quiser e conecte o toque para dentro para [self dismissModalViewControllerAnimated:YES];
Isso deve fazer o truque.
EDITAR:
Então agora você tem uma visualização da web personalizada do tipo myWebView
que estou assumindo herdar TTWebController
. Isso é bom. Como um aparte, você realmente não precisa inicializar uma nova instância apenas para obter a aula, você pode fazer isso com apenas [myWebView class]
Porque a mensagem da classe está na classe, não na instância.
No entanto, mesmo que você tenha decidido criar uma nova instância usando um XIB, não acho que o TTNavigator esteja instantando a instância do controlador da mesma maneira. Em vez disso, acredito que será lançado com este construtor (extraído de 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;
}
Portanto, na implementação do seu filho, você pode fornecer uma versão personalizada dessa implementação como assim:
- (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;
}
Eu não testei, eu estaria interessado em ver o que realmente está fazendo se não estiver fazendo isso. Se você preferir o XIBS (como eu, ao contrário de três20), precisará fazer uma etapa extra para carregar isso. Eu tenho uma categoria na minha estrutura de utilitário que ajuda com isso:
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
o objectAtIndex
A parte ocorre porque todos os XIBs contêm uma matriz, mesmo que haja apenas uma vista dentro. Isso apenas retornará o primeiro uiview no XIB.