Ios 将行添加到UITableView后出现意外的滚动行为

Ios 将行添加到UITableView后出现意外的滚动行为,ios,uitableview,Ios,Uitableview,我是一个新手,刚开始制作我的第一个应用程序,没有在书或教程中跟随。我创建了一个简单的应用程序,它在启动时显示一个UITableView,其中有一个单独的部分,标题中有一个文本字段,最初没有行。当您在文本字段中输入一些文本时,它会进行web API调用(从Wikipedia获取一些JSON数据),然后用调用结果填充表行。通常,有足够多的结果使得表格底部在屏幕上不再可见。一切都很好,直到我尝试滚动表格。当这种情况发生时,屏幕的右边缘不会出现滚动条,并且桌子不会随着我的手指移动而以一对一的比例移动。当

我是一个新手,刚开始制作我的第一个应用程序,没有在书或教程中跟随。我创建了一个简单的应用程序,它在启动时显示一个UITableView,其中有一个单独的部分,标题中有一个文本字段,最初没有行。当您在文本字段中输入一些文本时,它会进行web API调用(从Wikipedia获取一些JSON数据),然后用调用结果填充表行。通常,有足够多的结果使得表格底部在屏幕上不再可见。一切都很好,直到我尝试滚动表格。当这种情况发生时,屏幕的右边缘不会出现滚动条,并且桌子不会随着我的手指移动而以一对一的比例移动。当我松开手指时,表格会弹回到顶部,因此文本字段再次位于屏幕顶部-因此基本上,在屏幕上出现任何行或足够少的行之前,它的行为方式与它的行为方式相同。新数据输入后,我正在向表视图发送
reloadData
——是否需要向其发送其他消息,通知其大小已更改或其他信息

编辑:我在MacRumors的论坛上发布了同样的问题,还有我的项目文件。如果您认为项目文件可以帮助我,请下载项目文件。

从WordsHeaderView nib文件中删除“使用自动布局”。 单击nib文件,进入“文件检查器”并取消选中“使用自动布局”。 在页眉视图中有一些自动布局约束,“锁定”表格滚动

从WordsHeaderView nib文件中删除“使用自动布局”。 单击nib文件,进入“文件检查器”并取消选中“使用自动布局”。 页眉视图中有一些自动布局约束,“锁定”表格滚动,而不是将其添加为“ViewForHeaderSection”,是否尝试将其设置为“tableHeaderView”。 可能如下

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    tableView.tableHeaderView = [self headerView];
    return 1;
}
您是否尝试将其设置为“tableHeaderView”,而不是将其添加为“viewForHeaderInSection”。 可能如下

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    tableView.tableHeaderView = [self headerView];
    return 1;
}

在WTAppDelegate.m中,更改-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项

追随

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    WordsViewController *viewController = [[WordsViewController alloc] init];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    [[self window] setRootViewController:navController];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
      WordsViewController *viewController = [[WordsViewController alloc] init];
      [[self window] setRootViewController:viewController];
      [self.window makeKeyAndVisible];
       return YES;
}
然后在WordsViewController.m中注释方法-(id)initWithStyle:(UITableViewStyle)style和-(id)init,并添加以下方法

-(void)loadView{
    [super loadView]; 
}

在WTAppDelegate.m中,更改-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项

追随

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    WordsViewController *viewController = [[WordsViewController alloc] init];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    [[self window] setRootViewController:navController];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
      WordsViewController *viewController = [[WordsViewController alloc] init];
      [[self window] setRootViewController:viewController];
      [self.window makeKeyAndVisible];
       return YES;
}
然后在WordsViewController.m中注释方法-(id)initWithStyle:(UITableViewStyle)style和-(id)init,并添加以下方法

-(void)loadView{
    [super loadView]; 
}

在WTAppDelegate.m中,更改-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项

追随

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    WordsViewController *viewController = [[WordsViewController alloc] init];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    [[self window] setRootViewController:navController];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
      self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
      WordsViewController *viewController = [[WordsViewController alloc] init];
      [[self window] setRootViewController:viewController];
      [self.window makeKeyAndVisible];
       return YES;
}
注释掉WordsViewController.m中的以下方法

  • -(id)initWithStyle:(UITableViewStyle)样式
  • -(id)init
  • -(UIView*)头视图
  • -(UIView*)表格视图:(UITableView*)表格视图用于标题部分:(NSInteger)部分
  • -(CGFloat)表格视图:(UITableView*)表格视图头部高度部分:(NSInteger)部分
  • 无需添加loadView方法

    在WordsViewController.m中,将以下内容添加到-(void)viewDidLoad


    在WTAppDelegate.m中,更改-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项

    追随

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        WordsViewController *viewController = [[WordsViewController alloc] init];
        UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
        [[self window] setRootViewController:navController];
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        return YES;
    }
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
     {
          self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
          WordsViewController *viewController = [[WordsViewController alloc] init];
          [[self window] setRootViewController:viewController];
          [self.window makeKeyAndVisible];
           return YES;
    }
    
    注释掉WordsViewController.m中的以下方法

  • -(id)initWithStyle:(UITableViewStyle)样式
  • -(id)init
  • -(UIView*)头视图
  • -(UIView*)表格视图:(UITableView*)表格视图用于标题部分:(NSInteger)部分
  • -(CGFloat)表格视图:(UITableView*)表格视图头部高度部分:(NSInteger)部分
  • 无需添加loadView方法

    在WordsViewController.m中,将以下内容添加到-(void)viewDidLoad


    当您说“填充表行”时,代码中实际发生了什么?(通常,有一种数组为表提供数据。如果向数组中添加新对象并调用
    reloadData
    ,它通常“正常工作”…前提是您的表数据源方法返回正确的内容。)是的,我基本上有一个NSArray保存行的数据,以及
    tableView:cellforrowatinexpath:
    的一个实现,它为数组中的每个对应项逐条输出一个单元格。My
    ConnectionIDFinishLoading:
    实现解析获取的数据并用它填充数据数组。当您说“填充表行”时,代码中实际发生了什么?(通常,有一种数组为表提供数据。如果向数组中添加新对象并调用
    reloadData
    ,它通常“正常工作”…前提是您的表数据源方法返回正确的内容。)是的,我基本上有一个NSArray保存行的数据,以及
    tableView:cellforrowatinexpath:
    的一个实现,它为数组中的每个对应项逐条输出一个单元格。我的
    connectiondFinishLoading:
    实现解析提取的数据并用它填充数据数组。我在“文件检查器”窗格下找到了复选框,而不是“标识检查器”,但取消选中该框后,一切正常。谢谢,享受你的+50!我会去做一些研究,看看这个复选框到底在做什么,这样以后就不会难倒我了。我在“文件检查器”窗格下找到了该复选框,而不是“身份检查器”,但在取消选中该复选框后,一切都如期进行。谢谢,享受你的+50!我会去做一些研究,看看这个复选框到底在做什么,这样以后就不会让我难堪了。如果我不需要UINavigationController,为什么我要实现一个UINavigationController呢?这只是一种标准做法还是什么?另外,loadView JU的实现不是很简单吗