tableView:didSelectRowAtIndexPath:调用TTNavigator openURLAction:applyAnimated: - UITabBar和navigationItem消失
我有一个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显示?
我找到了一个解决方案:
我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;
}
在你TableViewController,添加:
- (id<UITableViewDelegate>)createDelegate {
return self;
}
然后你就可以实现自己的didSelectRowAtIndexPath方法和accessoryButtonTappedForRowWithIndexPath方法。