iPhone viewForHeaderInSection

时间:2012-02-29 12:02:09

标签: iphone uitableview grand-central-dispatch

我有一个带导航控制器和一些表视图控制器的应用程序。在表视图控制器中,我有两个部分标题我的定义:

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

    }

}

我使用“静态dispatch_once_t onceToken; dispatch_once(& onceToken,^ {”,因为我只需要第一次创建此标题(因为当我滚动表时,方法是调用并调用...这是错误的)。 .. 一切正常,当我创建表视图控制器它显示标题时,当我滚动它,没有任何东西正在重新创建(很好),但当我按下按钮a然后重新打开tableview控制器标题是空的。哪里有问题?有没有解决方案,如何解决?非常感谢

3 个答案:

答案 0 :(得分:1)

好吧,对我而言,静态调度似乎是个问题。

当您按下“返回”按钮时,可能是您的视图暂停了表格视图(我不知道您的代码,但我想它就是这样),这意味着所有内部变量已经消失了 - 除了你的静态调度,在下次实例化视图时不会被调用。因此,在下一个实例化期间,不会创建 segmentItems ,但由于视图已发布,因此它们为空。您应该以不同方式解决“仅创建一次”问题,例如通过在字典中记住创建的 segmentItems ,并在它们不存在的情况下从那里获取它们。

答案 1 :(得分:0)

使用断点检查它并查看该过程。它可能是内存分配问题。看到这可能会对你有所帮助。 http://www.icodeblog.com/2010/12/10/implementing-uitableview-sections-from-an-nsarray-of-nsdictionary-objects/

答案 2 :(得分:0)

你正在使用dispatch_once而不需要。即使您随后从内存中删除视图控制器并取消分配segmentControl,该块也只会执行一次

使用延迟加载 - 在视图控制器中为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。第一次调用它时,它将被创建,随后的时间,它将被重新使用。