Добавление кнопки «Закрыть» в Three20 TTWebController - iPhone - PullRequest
0 голосов
/ 06 января 2011

Я представляю TTWebController как модальное представление, используя этот код:

TTNavigator* navigator = [TTNavigator navigator];
TTURLMap* map = navigator.URLMap;
[map from:@"*" toModalViewController:[TTWebController class]];

Все отлично работает, за исключением того, что на TTWebController нет кнопки «закрыть».Я знаю, что это обычно нажимается сбоку и получает кнопку «назад», но есть ли способ добавить кнопку «закрыть», не копаясь в фактическом коде Three20?

Обновление:

Вот код, который я использую для создания текста, а затем выдвигаю модальное представление на экран.Я хочу динамически отправлять любой URL, по которому щелкают, вместо «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]];

1 Ответ

1 голос
/ 06 января 2011

Вероятно, вам действительно нужен ваш собственный контроллер представления, который либо наследует, либо содержит TTWebController. Создайте и сопоставьте с этим вместо необработанного TTWebController, поместите кнопку, где хотите, и подключите сенсорный экран внутри к [self dismissModalViewControllerAnimated:YES];. Это должно помочь.

EDIT:

Итак, теперь у вас есть пользовательское веб-представление типа 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;
}

Я не проверял это, мне было бы интересно посмотреть, что он на самом деле делает, если он этого не делает. Если вы предпочитаете xibs (как я, в отличие от Three20), вам нужно будет выполнить дополнительный шаг загрузки. У меня есть категория в моей служебной среде, которая помогает с этим:

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 состоит в том, что все xib-ы содержат массив, даже если внутри есть только одно представление. Это просто вернет первый UIView в xib.

...