iPhone viewForHeaderInSection - PullRequest
       7

iPhone viewForHeaderInSection

1 голос
/ 29 февраля 2012

У меня есть приложение с контроллером навигации и контроллером табличного представления. В контроллере табличного представления у меня есть два заголовка раздела моих определений:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{

  if (section == 0) {

   UIView* customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 74)];

        UIImageView *myImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"toolbarTopBack.png"]];

        UILabel *headline = [[UILabel alloc] initWithFrame:CGRectMake(11, 14, 305, 21)];
        headline.backgroundColor = [UIColor clearColor];
        headline.textColor = [UIColor whiteColor];
        headline.font = [UIFont fontWithName:@"Helvetica Neue" size:21];
        headline.text = searchPosition;

        UILabel *subHeadline = [[UILabel alloc] initWithFrame:CGRectMake(11, 36, 305, 21)];
        subHeadline.backgroundColor = [UIColor clearColor];
        subHeadline.textColor = [UIColor grayColor];
        subHeadline.font = [UIFont fontWithName:@"Helvetica Neue" size:16];
        subHeadline.text = searchRegion;

        [customView addSubview:myImageView];
        [customView addSubview:headline];
        [customView addSubview:subHeadline];


        return customView;

    } else {

        // create the parent view that will hold header Label
        UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 44)];
        customView.userInteractionEnabled = YES;

        UIImageView *myImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mainToolBar.png"]];

        UIToolbar *topToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 44)];
        topToolbar.barStyle = UIBarStyleDefault;
        [topToolbar setBackgroundColor:[UIColor clearColor]];

        static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{

        NSMutableDictionary *appSettingsData = [[NSMutableDictionary alloc] initWithDictionary:[appDelegate getAppStrings]];

        NSArray *segmentItems = [NSArray arrayWithObjects:[NSString stringWithFormat:@"%@ (%d)", [appSettingsData valueForKey:@"segmentButton4"], listCountOffers], [NSString stringWithFormat:@"%@ (%d)", [appSettingsData valueForKey:@"segmentButton5"], [[appDelegate comunication] getSimilarCount:[appDelegate getCurrentCI] idPosition:idPosition idRegion:idRegion]], nil];

        segmentControl = [[UISegmentedControl alloc] initWithItems:segmentItems];
        segmentControl.frame = CGRectMake(6, 8, 308, 29);
        segmentControl.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        segmentControl.segmentedControlStyle = UISegmentedControlStyleBar;
        [segmentControl setTintColor:[UIColor grayColor]];
        [segmentControl addTarget:self action:@selector(segmentedControlIndexChanged:) forControlEvents:UIControlEventValueChanged];
        segmentControl.momentary = NO;
        segmentControl.selectedSegmentIndex = 0;

        });

        UIBarButtonItem *toolbarItem = [[UIBarButtonItem alloc] initWithCustomView:segmentControl];
        [topToolbar addSubview:toolbarItem.customView];

        [customView addSubview:myImageView];
        [customView addSubview:topToolbar];

        return customView;

    }

}

Я использую "static dispatch_once_t OnceToken; dispatch_once (& OnceToken, ^ {", потому что мне нужно создавать этот заголовок только в первый раз (потому что, когда я прокручиваю таблицу, метод - это вызов и вызов ... и это неправильно) ... Все работает нормально, когда я создаю контроллер табличного представления, он показывает заголовки, когда я прокручиваю его, ничего не воссоздается (это нормально), но когда я нажимаю кнопку «Назад», то вновь открываемые заголовки контроллера табличного представления пусты. Где проблема? Есть ли решение, как это исправить? Большое спасибо

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

Ну, мне кажется, это проблема с вашей статической отправкой.

Когда вы нажимаете кнопку Назад, есть вероятность, что ваше представление, содержащее представление таблицы, освобождается (я не знаю ваш код, но я полагаю, что это так), то есть все внутренние переменные ушел - кроме вашей статической отправки, , которая не будет вызываться в следующий раз, когда вы создадите представление . Таким образом, во время следующего создания ваши сегментItems не будут созданы, но, поскольку представление было освобождено, они пусты. Вы должны решить свою проблему «только один раз» по-другому, например, запомнив созданные сегментItems в словаре и получив их оттуда, если они еще не существуют.

0 голосов
/ 29 февраля 2012

Вы используете dispatch_once без особой необходимости. Блок будет выполняться только один раз , даже если впоследствии вы удалите контроллер представления из памяти и освободите сегментControl.

Вместо этого используйте отложенную загрузку - создайте свойство для вашего segmentControl представления в вашем контроллере представления, и в аксессоре для этого, если резервный ivar равен nil, создайте его тогда:

Ваше обобщающее утверждение:

@synthesize segmentControl = _segmentControl

Ваш метод доступа:

-(UISegmentedControl*)segmentControl
{
    if (_segmentControl)
        return _segmentControl;

    UISegmentedControl *segmentControl = //... create your control here 
    self.segmentControl = segmentControl
    return segmentControl;
}

Тогда, когда вы хотите использовать представление, используйте self.segmentControl. При первом вызове он будет создан, а затем снова будет использован.

0 голосов
/ 29 февраля 2012

проверьте это с точкой останова и посмотрите процесс.это может быть проблема выделения памяти.Посмотрите, это может вам помочь.http://www.icodeblog.com/2010/12/10/implementing-uitableview-sections-from-an-nsarray-of-nsdictionary-objects/

...