2010-04-28 56 views
0

我有一个UITabBar现有的iPhone项目。现在我需要在我的应用程序中将样式文本和文本链接指向其他ViewController。我正在尝试整合TTStyledTextLabel。tableView:didSelectRowAtIndexPath:调用TTNavigator openURLAction:applyAnimated: - UITabBar和navigationItem消失

我有一个FirstViewController:UITabelViewController本的tableView:didSelectRowAtIndexPath方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *url; 
    if ([self.filteredQuestions count]>0) { 
     url = [NSString stringWithFormat:@"%@%d", @"tt://question/", [[self.filteredQuestions objectAtIndex:indexPath.row] id]]; 

     [[TTNavigator navigator] openURLAction:[[TTURLAction actionWithURLPath: url] applyAnimated:YES]]; 
    } else { 
     Question * q = [self.questions objectAtIndex:indexPath.row] ; 
     url = [NSString stringWithFormat:@"%@%d", @"tt://question/", [q.id intValue]]; 
    } 

    TTDPRINT(@"%@", url); 
    TTNavigator *navigator = [TTNavigator navigator]; 
    [navigator openURLAction:[[TTURLAction actionWithURLPath: url] applyAnimated:YES]]; 

} 

我的映射是这样的:

TTNavigator* navigator = [TTNavigator navigator]; 
navigator.window = window; 
navigator.supportsShakeToReload = YES; 
TTURLMap* map = navigator.URLMap; 
[map from:@"*" toViewController:[TTWebController class]]; 
[map from:@"tt://question/(initWithQID:)" toViewController:[QuestionDetailViewController class]]; 

和我QuestionDetailViewController:

@interface QuestionDetailViewController : UIViewController <UIScrollViewDelegate , QuestionDetailViewProtocol> { 
    Question *question; 

} 

@property(nonatomic,retain) Question *question; 

-(id) initWithQID:(NSString *)qid; 
-(void) goBack:(id)sender; 

@end 

当我打一个单元格,q QuestionDetailViewController将被调用 - 但n avigationBar不会

@implementation QuestionDetailViewController 
@synthesize question; 


-(id) initWithQID:(NSString *)qid 
{ 
    if (self = [super initWithNibName:@"QuestionDetailViewController" bundle:nil]) { 
    //; 
    TTDPRINT(@"%@", qid); 

    NSManagedObjectContext *managedObjectContext = [(domainAppDelegate*)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

    NSPredicate *predicate =[NSPredicate predicateWithFormat:@"id == %@", qid]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Question" 
               inManagedObjectContext:managedObjectContext]; 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 
    [request setPredicate:predicate]; 
    NSError *error = nil; 
    NSArray *array = [managedObjectContext executeFetchRequest:request error:&error]; 

    if (error==nil && [array count]>0) { 
     self.question = [array objectAtIndex:0]; 
     } else { 
      TTDPRINT(@"error: %@", array); 
     } 
    } 
    return self; 
} 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [TTStyleSheet setGlobalStyleSheet:[[[TextTestStyleSheet alloc] init] autorelease]]; 

    [self.navigationController.navigationBar setTranslucent:YES]; 
    NSArray *includedLinks = [self.question.answer.text vs_extractExternalLinks]; 

    NSMutableDictionary *linksToTT = [[NSMutableDictionary alloc] init]; 
    for (NSArray *a in includedLinks) { 
     NSString *s = [a objectAtIndex:3]; 
     if ([s hasPrefix:@"/answer/"] || [s hasPrefix:@"http://domain.com/answer/"] || [s hasPrefix:@"http://www.domain.com/answer/"]) { 
      NSString *ttAdress = @"tt://question/"; 
      NSArray *adressComps = [s pathComponents]; 
      for (NSString *s in adressComps) { 
       if ([s isEqualToString:@"qid"]) { 
        ttAdress = [ttAdress stringByAppendingString:[adressComps objectAtIndex:[adressComps indexOfObject:s]+1]]; 
       } 
      } 
      [linksToTT setObject:ttAdress forKey:s]; 
     } 
    } 
    for (NSString *k in [linksToTT allKeys]) { 
     self.question.answer.text = [self.question.answer.text stringByReplacingOccurrencesOfString:k withString: [linksToTT objectForKey:k]]; 
    } 

    TTStyledTextLabel *answerText = [[[TTStyledTextLabel alloc] initWithFrame:CGRectMake(0, 0, 320, 700)] autorelease]; 
    if (![[self.question.answer.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] hasPrefix:@"<div"]) { 
     self.question.answer.text = [NSString stringWithFormat:@"%<div>%@</div>", self.question.answer.text]; 
    } 

    NSString * s = [NSString stringWithFormat:@"<div class=\"header\">%@</div>\n%@",self.question.title ,self.question.answer.text]; 

    answerText.text = [TTStyledText textFromXHTML:s lineBreaks:YES URLs:YES]; 
    answerText.contentInset = UIEdgeInsetsMake(20, 15, 20, 15); 
    [answerText sizeToFit]; 

    [self.navigationController setNavigationBarHidden:NO animated:YES]; 
    [self.view addSubview:answerText]; 
    [(UIScrollView *)self.view setContentSize:answerText.frame.size]; 
    self.view.backgroundColor = [UIColor whiteColor]; 
    [linksToTT release]; 
} 


....... 

@end 

这个工程相当不错,只要一个细胞被触摸时,一个QuestionDetailViewController被称为推 - 但使用TabBar就会消失,navigationItem - 我把它像这样:​​- 不会被显示。它只是没有动画而出现。

但是,如果我按下TTStyledTextLabel中的链接动画工作,navigationItem将显示。

如何使动画,导航项和tabBar显示?

回答

0

我找到了一个解决方案:

我QuestionDetailViewController实现TTNavigatorDelegate。

-(BOOL)navigator:(TTNavigator *)navigator shouldOpenURL:(NSURL *)URL总是返回NO,但会致电[self.navigationController pushViewController:c animated:YES];

-(BOOL)navigator:(TTNavigator *)navigator shouldOpenURL:(NSURL *)URL { 
    NSEntityDescription *entity; 
    NSPredicate *predicate; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    if ([[URL host] isEqualToString:@"question"]) { 
     entity =[NSEntityDescription entityForName:@"Question" inManagedObjectContext:managedObjectContext]; 
     predicate = [NSPredicate predicateWithFormat:@"id == %@", [[URL path] stringByReplacingOccurrencesOfString:@"/" withString:@""]]; 

     [request setEntity:entity]; 
     [request setPredicate:predicate]; 

     NSError *error =nil; 
     NSArray *array = [managedObjectContext executeFetchRequest:request error:&error]; 
     if (error==nil && [array count] >0) { 
      QuestionDetailViewController *c = [[[QuestionDetailViewController alloc] init] autorelease]; 
      c.question = [array objectAtIndex:0]; 
      [self.navigationController pushViewController:c animated:YES]; 
     } 
    } 
    [request release]; 
    return NO; 
} 
0

在你TableViewController,添加:

- (id<UITableViewDelegate>)createDelegate { 
    return self; 
} 

然后你就可以实现自己的didSelectRowAtIndexPath方法和accessoryButtonTappedForRowWithIndexPath方法。

相关问题