我正在使用iPad应用程序,在某些时候,我需要显示一个带有用户选择选项的弹出窗口。为此,我在UIPopoverController中使用UITableView。问题是,在iPad上(不在模拟器上),当滚动桌面视图时,我得到一种“双视觉”效果,它看起来像是存在两组列表。一个是静止的,一个是上下滚动的。
我构建了这样的popover:
self.fClassTypeList = [[NSMutableArray alloc] init];
[self.fClassTypeList removeAllObjects];
NSUInteger stringLength = 0;
(populate self.fClassTypeList, and set stringLength to the size of the longest entry)
[self setContentSizeForViewInPopover:CGSizeMake(stringLength * 15.0f, [self.fClassTypeList count] * 30)];
CGFloat tableBorderLeft = 5;
CGFloat tableBorderRight = 5;
CGRect viewFrame = self.view.frame;
viewFrame.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table
self.fListOfItems = [[UITableView alloc] initWithFrame:viewFrame style:UITableViewStylePlain];
self.fListOfItems.delegate = self;
self.fListOfItems.dataSource = self;
[self.view addSubview:self.fListOfItems];
我把viewDidLayoutSubviews(...)放在视图控制器的一部分,也许我应该把它放在其他地方?我不确定为什么会在实际机器上发生这种情况,而不是模拟器。
答案 0 :(得分:1)
-viewDidLayoutSubviews
放置分配是一个奇怪的地方,因为该方法可以被多次调用。因此,就您的主要问题而言,我认为您应该将您的分配移至-init
方法,并将布局代码移至-viewWillAppear
方法。
- (id)init
{
self = [super init];
if (self)
{
self.fClassTypeList = [[NSMutableArray alloc] init];
self.fListOfItems = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
self.fListOfItems.delegate = self;
self.fListOfItems.dataSource = self;
[self.view addSubview:self.fListOfItems];
}
return self;
}
- (void )viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSUInteger stringLength = 0;
CGFloat tableBorderLeft = 5;
CGFloat tableBorderRight = 5;
CGRect viewFrame = self.view.frame;
viewFrame.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table
self.fListOfItems.frame = viewFrame;
[self setContentSizeForViewInPopover:CGSizeMake(stringLength * 15.0f, [self.fClassTypeList count] * 30)];
}
这促进了更好的内存管理。
作为一个额外的奖励,我会建议你重构
将[self setContentSizeForViewInPopover:CGSizeMake(stringLength * 15.0f, [self.fClassTypeList count] * 30)];
方法转换为fClassTypeList
的setter方法。更好的方法是简单地在同一个setter方法中调用-viewWillAppear:
。这将促进良好的可伸缩性,因为您(或其他人)稍后将继续构建此代码。
看到你在这段代码中想要完成什么,这有点令人困惑,因为它是如此硬编码所以让我知道我是否错过了你正在寻找的标记(有解释原因)和我我会做一个编辑。
干杯