tableView: didSelectRowAtIndexPath: вызывает TTNavigator openURLAction: applyAnimated: - UITabBar и navigationItem исчезают - PullRequest
0 голосов
/ 28 апреля 2010

У меня есть существующий проект iphone с UITabBar. Теперь мне нужны стилизованные текстовые и текстовые ссылки на другие ViewControllers в моем приложении. Я пытаюсь интегрировать 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 исчезнет, ​​а навигационный элемент - я установил его так: self.navigationItem.title =@"back to first screen"; - не будет отображаться. И это просто появляется без анимации.

Но если я нажму на ссылку внутри TTStyledTextLabel, анимация заработает, будет показан навигационный элемент.

Как сделать так, чтобы анимация, элемент навигации и панель вкладок отображались?

Ответы [ 2 ]

0 голосов
/ 26 октября 2010

В вашем TableViewController добавьте:

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

Затем вы можете реализовать свои собственные методы didSelectRowAtIndexPath и accessoryButtonTappedForRowWithIndexPath.

0 голосов
/ 29 апреля 2010

Я нашел решение:

Мой 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;
}
...