Как очистить предыдущий вид при загрузке нового подробного вида при щелчке строки в UITableView - iOS4 - PullRequest
0 голосов
/ 29 октября 2011

Мне нужно отобразить детализированный контроллер представления с несколькими метками при щелчке строки в табличном представлении. Ярлыки, которые я показываю, имеют динамическую высоту в зависимости от содержимого, которое читается из внутреннего календаря iPhone. Мне удалось реализовать загрузку подробных видов в зависимости от того, какая строка в табличном представлении была выбрана. Моя проблема в том, что предыдущий подробный вид не очищается при нажатии новой строки. Особенно в том случае, когда в моем предыдущем подробном представлении были более длинные метки, а в новом подробном представлении - более короткие, я могу видеть содержимое предыдущих меток под новым. Как я могу очистить весь контроллер Detail View перед перезагрузкой его с данными новой строки. Ниже приведен код, который я использую:

RootViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

if (mdController == nil) {
    MtgDetailController *aController = [[MtgDetailController alloc] initWithNibName:@"MtgDetailController" bundle:nil];
    self.mdController = aController;
    [aController release];        
}
self.mdController.mtgIndex = indexPath.row;
//    mdController.mtgIndex = indexPath.row;
//    [mdController setMtgIndex:indexPath.row];
//    NSInteger temp = indexPath.row;

UIActionSheet *action = [[UIActionSheet alloc]
                         initWithTitle:@"Select an Option" 
                         delegate:self 
                         cancelButtonTitle:@"Cancel" 
                         destructiveButtonTitle:nil 
                         otherButtonTitles:@"Open Meeting", @"Dial into meeting", nil];

[action showInView:self.parentViewController.view];
[action release];
}

MtgDetailController.m (это контроллер подробного представления)

-(void) viewDidAppear:(BOOL)animated { 

//    [self reloadInputViews];
Smart_MeetingAppDelegate *myDelegate = (Smart_MeetingAppDelegate *)[[UIApplication   sharedApplication]delegate];
CGRect scrollViewFrame = CGRectMake(0, 0, 320, 460);
NSString *title = [myDelegate.titles objectAtIndex:self.mtgIndex];
NSString *mtg_time = [myDelegate.mtg_times objectAtIndex:self.mtgIndex];
NSString *loc = @"Conf Room 123";
//    detail = @"test mtg test mtg. Dial number: 3334445555, (333)444-5555, 333-333-5555. ID: 4455333344, Password: 6576567";
detail = [myDelegate.detail_array objectAtIndex:self.mtgIndex];

NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:@"\\b[0-9]+(\\-)?(\\))?(\\.)?(\\s)?([0-9]+)?(\\-)?(\\.)?(\\s)?([0-9]+)?(\\-)?(\\.)?(\\s)?([0-9]+)?\\b" options:NSRegularExpressionCaseInsensitive error:nil];
NSArray* matches = [regex matchesInString:detail options:0 range:NSMakeRange(0, [detail length])];
[regex release];

unichar chr[1] = {'\n'};
NSString *singleCR = [NSString stringWithCharacters:(const unichar *)chr length:1];
NSString *titleRow = [NSString stringWithFormat:@"%@ %@ %@", title, singleCR, mtg_time];

NSMutableAttributedString *attrTitle = [NSMutableAttributedString attributedStringWithString:titleRow];
[attrTitle setFont:[UIFont systemFontOfSize:18] range:[titleRow rangeOfString:title]];
[attrTitle setFont:[UIFont systemFontOfSize:16] range:[titleRow rangeOfString:mtg_time]];

NSMutableAttributedString *attrLoc = [NSMutableAttributedString attributedStringWithString:loc];
NSMutableAttributedString *attrDetail = [NSMutableAttributedString attributedStringWithString:detail];
[attrDetail setFont:[UIFont systemFontOfSize:16]];

CGSize suggestedSize = [attrTitle sizeConstrainedToSize:CGSizeMake(300, FLT_MAX)];
CGRect frame1 = CGRectMake(10, 15, 300, suggestedSize.height);
OHAttributedLabel *lblTitle = [[OHAttributedLabel alloc] initWithFrame:frame1]; 
lblTitle.numberOfLines = 0;

CGSize size2 = [attrLoc sizeConstrainedToSize:CGSizeMake(300, FLT_MAX)];
CGRect frame2 = CGRectMake(10, suggestedSize.height+15+5, 300, size2.height);
OHAttributedLabel *lblLocation = [[OHAttributedLabel alloc] initWithFrame:frame2]; 
CGFloat temp = size2.height+suggestedSize.height;

CGSize size3 = [attrDetail sizeConstrainedToSize:CGSizeMake(300, FLT_MAX)];
CGRect frame3 = CGRectMake(10, temp+15+5, 300, size3.height);
OHAttributedLabel *lblDescription = [[OHAttributedLabel alloc] initWithFrame:frame3]; 
lblDescription.numberOfLines = 0;

lblTitle.attributedText = attrTitle;
lblLocation.attributedText = attrLoc;
lblDescription.attributedText = attrDetail;

for (NSTextCheckingResult *m in matches) {
    NSString *num = [detail substringWithRange:m.range];
    NSRange linkRange = [detail rangeOfString:num];
    [lblDescription addCustomLink:[NSURL URLWithString:@"user://certa"] inRange:linkRange];
}
lblDescription.delegate = self;

[self.view addSubview:lblTitle];
[self.view addSubview:lblDescription];
[self.view addSubview:lblLocation];


[lblTitle release];
[lblLocation release];
[lblDescription release];
}

1 Ответ

0 голосов
/ 30 октября 2011

Вы добавляете три новых экземпляра OHAttributedLabel к подробному виду каждый раз, когда выполняется viewDidAppear:.Вы никогда не удаляете эти представления.Вам нужно сохранить ссылки на них (lblTitle, lblDescription и lblLocation) в вашем MtgDetailController и либо удалить их, либо повторно использовать их при следующем выполнении viewDidAppear:.

Добавьте трисвойства ваших MtgDetailController:

@property (retain) UILabel *lblTitle;
@property (retain) UILabel *lblDescription;
@property (retain) UILabel *lblLocation;

(не забудьте также @synthesize их.)

Вверху viewDidAppear: удалите метки из их суперпредставлений:

- (void)viewDidAppear:(BOOL)animated {
    [self.lblTitle removeFromSuperview];
    [self.lblDescription removeFromSuperview];
    [self.lblLocation removeFromSuperview];
    ...

Внизу viewDidAppear: сохраните вновь созданные ярлыки в свойствах:

self.lblTitle = lblTitle;
self.lblLocation = lblLocation;
self.lblDescription = lblDescription;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...