我的UITableView
发生了一个奇怪的问题。即使我在IB中指定了它的高度,当重新加载时,有时高度会发生变化 - 通常会增加。这会导致表格的底部被其他视图元素遮挡,并且无法滚动到最底行。
为什么表格大小会自行改变?
有一个产品视图,用户可以在其中选择要添加到订单中的一堆产品。然后,他们点击按钮查看订单。产品视图将产品信息传递到下一个视图,我们将其称为购物车视图并加载它。这是购物车视图:
观点:
购物车视图将产品加载到表中,然后它向服务器提交请求以验证订单。服务器会响应错误(例如,产品的库存不足)以及任何适用的折扣。然后重新加载该表,并包含此信息(错误显示在单元格内,折扣项目作为新单元格添加)。
购物车视图控制器中的相关代码:
- (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。
当我调试时,我发现当第一次加载表时,调试器会将表的高度显示为459.但是当它再次加载时(从服务器收到响应后,高度为no)更长459):
这似乎只有在表格中有大量单元格时才会发生。
[UPDATE] 问题是,当我的父视图关闭时,我在桌面上打开了自动布局。一旦我为父视图打开autolayout,表的高度保持不变,我可以滚动到底行。
答案 0 :(得分:1)
我认为问题出在您的笔尖上AutoLayout已启用。这就是为什么它不接受你的身高。使用自动布局后,将忽略子视图中的所有修改。如果您要使用非自动布局,则应该查看所有视图。