tableView:didSelectRowAtIndexPath:调用TTNavigator openURLAction:applyAnimated: - UITabBar和navigationItem消失

时间:2010-04-28 16:22:01

标签: iphone three20

我有一个带有UITabBar的现有iphone项目。现在我需要在我的应用程序中使用样式文本和文本链接到其他ViewControllers。我正在尝试集成TTStyledTextLabel。

我有一个FirstViewController:带有这个tableView的UITabelViewController: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 - 但是navigationBar不会

@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 - 我这样设置:self.navigationItem.title =@"back to first screen"; - 将不会显示。它只是没有动画而出现。

但是如果按TTStyledTextLabel中的链接动画,则会显示navigationItem。

如何显示动画,navigationItem和tabBar?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

在TableViewController中,添加:

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

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