iOS:UITableView在popover和see"复视"影响

时间:2014-06-10 23:17:26

标签: ios user-interface

我正在使用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(...)放在视图控制器的一部分,也许我应该把它放在其他地方?我不确定为什么会在实际机器上发生这种情况,而不是模拟器。

1 个答案:

答案 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:。这将促进良好的可伸缩性,因为您(或其他人)稍后将继续构建此代码。

看到你在这段代码中想要完成什么,这有点令人困惑,因为它是如此硬编码所以让我知道我是否错过了你正在寻找的标记(有解释原因)和我我会做一个编辑。

干杯