Añadiendo un botón “Cerrar” para Three20 TTWebController - iPhone
-
26-09-2019 - |
Pregunta
Me presento una TTWebController como una vista modal utilizando este código:
TTNavigator* navigator = [TTNavigator navigator];
TTURLMap* map = navigator.URLMap;
[map from:@"*" toModalViewController:[TTWebController class]];
Todo funciona muy bien, excepto que no hay un botón "Cerrar" en la TTWebController. Sé que esto es por lo general empujado desde un lado y le da un botón de "atrás", pero ¿hay una manera de añadir un botón de "cerrar" sin cavar en el código real Three20?
Actualización:
Este es el código que estoy usando para crear el texto y luego empujar el modal Ver en la pantalla. Quiero enviar de forma dinámica lo que se hace clic en el URL, en 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]];
Solución
Es probable que lo que realmente quiere es su propio controlador de vista, ya sea que hereda de o contiene un TTWebController. Crear y asignar a ese lugar de la TTWebController
prima, poner el botón siempre que te gusta y el alambre en el contacto en el interior de [self dismissModalViewControllerAnimated:YES];
Que debe hacer el truco.
EDIT:
Así que ahora usted tiene una vista web personalizada de tipo myWebView
que estoy asumiendo que hereda de TTWebController
. Eso es bueno. Dicho sea de paso, no se necesita realmente para inicializar una nueva instancia de ella sólo para obtener la clase, se puede hacer eso con sólo [myWebView class]
porque el mensaje es la clase de la clase, no es el caso.
Sin embargo, a pesar de que se haya decidido a crear una nueva instancia utilizando un xib, no creo TTNavigator será instanciando la instancia de controlador en esa misma forma. En vez Creo que va a poner en marcha con este constructor (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;
}
Así que, en su aplicación hijo, usted puede proporcionar una versión personalizada de esta implementación de esta manera:
- (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;
}
Yo no lo he probado, estaría interesado en ver lo que realmente está haciendo si no lo está haciendo. Si prefiere xibs (como yo, a diferencia de Three20), entonces usted tendrá que hacer un paso adicional de la carga de eso. Tengo una categoría en mi marco utilidad que ayuda con esto:
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
La parte objectAtIndex
es porque todos xibs contienen una matriz, incluso si sólo hay una vista interior. Esto sólo devolverá el primer UIView en el XI ter.