我有一个带导航控制器和一些表视图控制器的应用程序。在表视图控制器中,我有两个部分标题我的定义:
- (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控制器标题是空的。哪里有问题?有没有解决方案,如何解决?非常感谢
答案 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
。第一次调用它时,它将被创建,随后的时间,它将被重新使用。