背景:我正在开发我的第一个iOS应用程序,该应用程序使用UITableView从Web源动态加载数据。不,这不是家庭作业。
问题:当我向下滚动列表时,会跳回到顶部。
我尝试的事情:
[tableView reloadData]
,但这并没有改变行为。我甚至把它连接到一个按钮,以确保它在填充视图后被激活。contentSize
的帖子以及如何根据表格中加载的数据量进行计算。这看起来像我需要的解决方案,但我无法清楚地解释如何为我的设置实现它。代码:
我使用单一视图应用程序模板启动了一个新项目,并在主故事板的默认视图中添加了UITableView
。
在视图控制器中,我有以下(相关)代码:
@interface ERViewController ()
@property (nonatomic, strong) NSMutableArray *myArray;
@property (nonatomic,retain) UITableView *tableView;
@end
@implementation ERViewController
{
NSMutableArray *tableData;
}
这里我将Parse.com中的数据加载到我的表中,然后调用[self loadView]
以在查询完成后让视图更新。
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableArray *returnedData = [[NSMutableArray alloc] init];
PFQuery *query = [PFQuery queryWithClassName:@"Persons"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
for (PFObject *object in objects) {
//NSLog(@"display name: %@",object[@"firstName"]);
[returnedData addObject:[NSString stringWithFormat:@"%@, %@", object[@"lastName"],object[@"firstName"]]];
}
tableData = returnedData;
// Reload view to display data
[self loadView];
} else {
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"SimpleTableItem";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
// Configure the cell
cell.textLabel.text = [tableData objectAtIndex:indexPath.row];
NSArray *itemArray = [NSArray arrayWithObjects: @"✔︎", @"?", @"X", nil];
UISegmentedControl *mainSegment = [[UISegmentedControl alloc] initWithItems:itemArray];
mainSegment.frame = CGRectMake(200,0, 100, 43);
self.navigationItem.titleView = mainSegment;
mainSegment.selectedSegmentIndex = [itemArray count];
[mainSegment addTarget:self
action:@selector(mainSegmentControl:)
forControlEvents: UIControlEventValueChanged];
mainSegment.tag = indexPath.row;
[cell.contentView addSubview:mainSegment];
return cell;
}
屏幕截图示例:
由于我正在等待数据加载,因此我不确定在何处调整视图大小以及我需要如何调整视图大小。
答案 0 :(得分:1)
您永远不会手动拨打loadView
。
tableData
上的tableView
来电reloadData
后。{/ p>
您还应该在viewDidAppear:
中加载表数据,如果您只想执行一次,请创建一个标志以查看其是否已加载。在等待加载数据时,tableData
将为nil
,因此如果您查询count
,则会发送nil
个对象,因此它会像返回0
。
最后你不应该触摸表视图的contentSize
,它自己处理。您只需要确保在Interface Builder中,表视图的框架与根视图框架相同。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSMutableArray *returnedData = [[NSMutableArray alloc] init];
PFQuery *query = [PFQuery queryWithClassName:@"Persons"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
for (PFObject *object in objects) {
//NSLog(@"display name: %@",object[@"firstName"]);
[returnedData addObject:[NSString stringWithFormat:@"%@, %@", object[@"lastName"],object[@"firstName"]]];
}
tableData = returnedData;
// Reload view to display data
[self.tableView reloadData];
} else {
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
}
如果您只想要一个只有UIViewController
的{{1}},请考虑使用UITableViewController
。
答案 1 :(得分:0)
发布给其他处理同样问题的人,不能只是转移到另一个视图控制器。
要解决一般视图控制器(而不是UITableView
)中UITableViewController
的问题,请单击视图控制器下方的小图标,如下所示:
该按钮标题为“解决自动布局问题”
选择“在View Controller中重置为建议的约束”
这解决了我所有的滚动问题,因为我必须错误地捕捉到自动布局边缘。