2010-04-28 61 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方法。

相關問題