0

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

我有一个 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 - 但导航栏不会

@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?

4

2 回答 2

0

在您的 TableViewController 中,添加:

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

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

于 2010-10-26T07:58:20.710 回答
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;
}
于 2010-04-29T06:29:15.743 回答