如何设置UITableView的高度来解决滚动问题?

时间:2014-05-03 18:25:11

标签: ios objective-c uitableview

背景:我正在开发我的第一个iOS应用程序,该应用程序使用UITableView从Web源动态加载数据。不,这不是家庭作业。

问题:当我向下滚动列表时,会跳回到顶部。

我尝试的事情

  1. suggestion(缩小表格视图的大小)有效,但现在我在屏幕底部有大空间。
  2. 我尝试过使用[tableView reloadData],但这并没有改变行为。我甚至把它连接到一个按钮,以确保它在填充视图后被激活。
  3. 我还阅读了一些关于contentSize的帖子以及如何根据表格中加载的数据量进行计算。这看起来像我需要的解决方案,但我无法清楚地解释如何为我的设置实现它。
  4. 代码

    我使用单一视图应用程序模板启动了一个新项目,并在主故事板的默认视图中添加了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;
    }
    

    屏幕截图示例:

    enter image description here


    由于我正在等待数据加载,因此我不确定在何处调整视图大小以及我需要如何调整视图大小。

2 个答案:

答案 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的问题,请单击视图控制器下方的小图标,如下所示:

enter image description here

该按钮标题为“解决自动布局问题”

选择“在View Controller中重置为建议的约束”

这解决了我所有的滚动问题,因为我必须错误地捕捉到自动布局边缘。