UITableView在重新加载时更改高度

时间:2014-01-04 21:22:02

标签: ios uitableview

我的UITableView发生了一个奇怪的问题。即使我在IB中指定了它的高度,当重新加载时,有时高度会发生变化 - 通常会增加。这会导致表格的底部被其他视图元素遮挡,并且无法滚动到最底行。

为什么表格大小会自行改变?

有一个产品视图,用户可以在其中选择要添加到订单中的一堆产品。然后,他们点击按钮查看订单。产品视图将产品信息传递到下一个视图,我们将其称为购物车视图并加载它。这是购物车视图:

观点: enter image description here

购物车视图将产品加载到表中,然后它向服务器提交请求以验证订单。服务器会响应错误(例如,产品的库存不足)以及任何适用的折扣。然后重新加载该表,并包含此信息(错误显示在单元格内,折扣项目作为新单元格添加)。

购物车视图控制器中的相关代码:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (!self.initialized) {
        [self saveOrderOnFirstLoad];
    }
}

- (void)saveOrderOnFirstLoad {
    if ([helper isOrderReadyForSubmission:self.coreDataOrder]) {
        self.coreDataOrder.status = @"pending";
        [[CoreDataUtil sharedManager] saveObjects];
        NSDictionary *parameters = [self.coreDataOrder asJSONReqParameter];
        //todo should we keep completed orders, complete? Or should we update status to pending if they go to cart view, even if they did not make any changes?
        NSString *method = [self.coreDataOrder.orderId intValue] > 0 ? @"PUT" : @"POST";
        NSString *url = [self.coreDataOrder.orderId intValue] == 0 ? [NSString stringWithFormat:@"%@?%@=%@", kDBORDER, kAuthToken, self.authToken] : [NSString stringWithFormat:@"%@?%@=%@", [NSString stringWithFormat:kDBORDEREDITS([self.coreDataOrder.orderId intValue])], kAuthToken, self.authToken];
        void (^successBlock)(NSURLRequest *, NSHTTPURLResponse *, id) = ^(NSURLRequest *req, NSHTTPURLResponse *response, id json) {
            self.savedOrder = [self loadJson:json];
            self.unsavedChangesPresent = NO;
        };
        void(^failureBlock)(NSURLRequest *, NSHTTPURLResponse *, NSError *, id) = ^(NSURLRequest *req, NSHTTPURLResponse *response, NSError *error, id json) {
            if (json) {
                [self loadJson:json];
            }
        };
        [helper sendRequest:method url:url parameters:parameters successBlock:successBlock failureBlock:failureBlock view:self.view loadingText:@"Submitting order"];
    }
    self.initialized = YES;
}

- (AnOrder *)loadJson:(id)json {
    AnOrder *anOrder = [[AnOrder alloc] initWithJSONFromServer:(NSDictionary *) json];
    [self.managedObjectContext deleteObject:self.coreDataOrder];//delete existing core data representation
    self.coreDataOrder = [helper createCoreDataCopyOfOrder:anOrder customer:self.customer loggedInVendorId:self.loggedInVendorId loggedInVendorGroupId:self.loggedInVendorGroupId managedObjectContext:self.managedObjectContext];//create fresh new core data representation
    [[CoreDataUtil sharedManager] saveObjects];
    [self refreshView];
    return anOrder;
}

- (void)refreshView {
    self.productsInCart = [helper sortProductsByinvtId:[self.coreDataOrder productIds]];
    self.discountsInCart = [helper sortDiscountsByLineItemId:[self.coreDataOrder discountLineItemIds]];
    [self.productsUITableView reloadData];
    [self updateTotals];
}

IB中设置的表格高度为459。 enter image description here

当我调试时,我发现当第一次加载表时,调试器会将表的高度显示为459.但是当它再次加载时(从服务器收到响应后,高度为no)更长459): enter image description here

这似乎只有在表格中有大量单元格时才会发生。

[UPDATE] 问题是,当我的父视图关闭时,我在桌面上打开了自动布局。一旦我为父视图打开autolayout,表的高度保持不变,我可以滚动到底行。

1 个答案:

答案 0 :(得分:1)

我认为问题出在您的笔尖上AutoLayout已启用。这就是为什么它不接受你的身高。使用自动布局后,将忽略子视图中的所有修改。如果您要使用非自动布局,则应该查看所有视图。