1

我已经设置了一个简单的演示应用程序,UITableViewController没有内容,但工具栏中有一个“添加”按钮。这将启动一个模态视图控制器,除了“取消”按钮之外,它又是空的。取消按钮只是告诉它的delegate(the UITableViewController) 关闭模式。

然后我在's方法中添加了一条NSLog语句。UITableViewControllernumberOfSectionsInTableView

通常,当表视图控制器加载时,我会看到两次调用numberOfSectionsInTableView. 当我打开并关闭模式(返回到UITableViewController)时,我看不到对numberOfSectionsInTableView.

但是,如果我0从中返回numberOfSectionsInTableView,除了显示的两个调用之外,我还会在模态关闭时看到一个额外的 numberOfSections 调用。

这仅在numberOfSectionsInTableView返回时发生0,除了提到的之外,我没有向我的项目添加任何其他代码。正如我所描述的那样,通过设置几个控制器并修改来自numberOfSectionsInTableView.

我的问题:

  • 为什么从模态视图返回UITableView调用?numberOfSectionsInTableView
  • numberOfSectionsInTableView为什么只有在返回时才这样做0
  • 除了numberOfSectionsInTableView,当模式被解除时,UITableViewController也会调用。cellForRowAtIndex:事实上,它正在尝试显示其dataSource. 如果添加的第一行已经自动更新,我该如何手动为行插入设置动画?难道不应该让我来确保 myUITableView与其一致dataSource吗?
  • 检查什么属性UITableViewController才能知道有一个或多个部分(因此询问我的代表有多少部分)?它不能是numberOfSectionsInTableView它自己,因为每当我从模态返回时,我都会看到它被调用,而不仅仅是在 numberOfSections = 0 时。
4

3 回答 3

2

来自UITableViewController文档:

当表格视图第一次加载时即将出现时,表格视图控制器重新加载表格视图的数据...... UITableViewController该类在超类方法中实现了这一点 viewWillAppear:

如果您在调试器中观看,应用程序启动时的第二次调用来自UITableViewController's viewWillAppear:implementation - 特别是上面提到的部分,tableView发送reloadData消息的位置。

现在,对 on launch 的第一个调用numberOfSectionsInTableView:也是来自UITableViewController的实现,viewWillAppear:但不是直接来自该实现对-[UITableView reloadData]. 我不确定第一个电话是怎么回事。

但是,对于您的问题,在解除模式时调用该调用具有与第二次numberOfSectionsInTableView:调用完全相同的调用堆栈from 。我的假设是,将零部分解释为处于根本没有加载的状态。这确实有些道理。我认为“空”表视图是没有任何的表视图,但没有任何部分的表视图对我来说似乎几乎“未初始化”。此外,文档暗示默认情况下有一节。从此方法返回零也与文档的假设不一致。applicationDidFinishLaunching:withOptions:UITableViewUITableViewDataSourceUITableView

现在,对于您对动画的关注 - 如果您为表格提供一个空白部分以使用,您将能够完全控制插入第一行的任何动画,并且不会被锁定在您需要的时候重新加载。

我认为这个故事的寓意是,不要返回零部分,除非你真的,真的因为某种原因需要。您帖子的标题也提到了这个表格视图是“空的”,但我认为很明显框架发现零部分不是空的而是卸载的。

希望这可以帮助!感谢您发布示例项目供我使用。

于 2012-09-08T06:17:52.360 回答
1

也许代表简直不敢相信自己的眼睛。但说真的,由于表格视图必须至少有一个部分,因此传递 0 没有任何意义。为什么这样做?你传给它一个无效的参数,它会给你一个奇怪的响应。至于为什么当你通过 1 时它不询问部分的数量,我认为这是因为它不需要知道此时(从模态视图控制器返回)——表格视图已经被填充(如果有一些数据)并且您没有更改模型中的任何内容,因此不需要更新。

每次您从模态视图控制器返回时,我都会在您的示例项目中添加几行以连续滑动,这就是我认为您正在尝试做的事情。我为 numberOfRowsInSection 的返回值添加了一个 int 属性 num,添加了一个数组来填充表,并从模式视图控制器解除方法调用了 insertRowsAtIndexPaths。

- (void)viewDidLoad
{
    _num = 0;
    self.theData = @[@"one",@"two",@"three"];
    [super viewDidLoad];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                                                                                          target:self
                                                                                          action:@selector(addRecipe)];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSLog(@"# sections requested");
    //when 0, this fires on return from the modal. When 1, it does not.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"in numberOfRows in section");
    return _num;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"in cellForRowAtIndexPath");
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
    cell.textLabel.text = [self.theData objectAtIndex:indexPath.row];
    return cell;
}

- (void)addRecipe
{
    //create the modal and suscribe for delegate notifications
    AddRecipeViewController *addRecipeController = [[AddRecipeViewController alloc]initWithStyle:UITableViewStyleGrouped];
    addRecipeController.delegate = self;

    //display the modal in a navigation controller
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addRecipeController];
    [self.navigationController presentModalViewController:navController animated:YES];
}

- (void)addRecipeVC:(AddRecipeViewController *)addRecipeVC didAddRecipe:(NSString *)recipe
{
    [self dismissModalViewControllerAnimated:YES];
    _num += 1;
    [self performSelector:@selector(addRow) withObject:nil afterDelay:.5];
}

-(void)addRow {
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:_num-1 inSection:0]] withRowAnimation:UITableViewRowAnimationRight];
}
于 2012-09-08T05:47:03.850 回答
0

表格视图在用数据填充表格视图时检查部分的数量!
由于表格可以分为多个部分,因此它必须具体知道将其分为多少个部分。

重新加载数据时,还会检查节数。

因为每次表格视图必须采取行动访问表格的数据,例如您点击了哪一行,在哪个部分,或者填充数据表时,必须知道部分的数量!


希望这有帮助!

于 2012-09-07T22:16:13.510 回答