tags:

views:

428

answers:

2

I have an existing iphone project with a UITabBar. Now I need styled text and in-text links to other ViewControllers in my app. I am trying to integrate TTStyledTextLabel.

I have a FirstViewController:UITabelViewController with this 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]];

}

My mapping looks like this:

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]];

and my QuestionDetailViewController:

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

}

@property(nonatomic,retain) Question *question;

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

@end

When I hit a cell, q QuestionDetailViewController will be called — but the navigationBar wont

@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

This works quite nice, as soon as a cell is touched, a QuestionDetailViewController is called and pushed — but the tabBar will disappear, and the navigationItem — I set it like this: self.navigationItem.title =@"back to first screen"; — won't be shown. And it just appears without animation.

But if I press a link inside the TTStyledTextLabel the animation works, the navigationItem will be shown.

How can I make the animation, the navigationItem and the tabBar be shown?

A: 

I found a solution:

My QuestionDetailViewController implements the TTNavigatorDelegate.

-(BOOL)navigator:(TTNavigator *)navigator shouldOpenURL:(NSURL *)URL will always return NO, but will call [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;
}
vikingosegundo
A: 

In your TableViewController, add:

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

Then you can implement your own didSelectRowAtIndexPath and accessoryButtonTappedForRowWithIndexPath methods.

Kirby Todd