1

コンテンツのないシンプルなデモ アプリケーションをセットアップしましたUITableViewControllerが、ツールバーに [追加] ボタンがあります。これにより、「キャンセル」ボタン以外は空のモーダル ビュー コントローラーが起動します。キャンセル ボタンは、そのdelegate( UITableViewController) にモーダルを閉じるように指示するだけです。

次に、のメソッドNSLogにステートメントを追加しました。UITableViewControllernumberOfSectionsInTableView

通常、テーブル ビュー コントローラーが読み込まれると、 への 2 つの呼び出しが表示されますnumberOfSectionsInTableView。モーダルを開いて閉じると (に戻りますUITableViewController)、それ以上の呼び出しは表示されませんnumberOfSectionsInTableView

ただし、0から戻るnumberOfSectionsInTableViewと、表示されている 2 つの呼び出しに加えて、モーダルが閉じられたときに追加の numberOfSections 呼び出しも表示されます。

numberOfSectionsInTableViewこれは が返された場合にのみ発生し0、言及した以外のコードをプロジェクトに追加していません。これは、説明したようにいくつかのコントローラーをセットアップし、 の結果を変更することで簡単に確認できますnumberOfSectionsInTableView

私の質問:

  • モーダル ビューから戻ったときにUITableView呼び出しが行われるのはなぜですか?numberOfSectionsInTableView
  • numberOfSectionsInTableViewを返す場合にのみこれを行うのはなぜ0ですか?
  • に加えてnumberOfSectionsInTableView、モーダルが閉じられたときにUITableViewControllerも呼び出されます。cellForRowAtIndex:実際、その の新しいコンテンツを表示しようとしていますdataSource。追加された最初の行が既に自動的に更新される場合、行の挿入を手動でアニメーション化するにはどうすればよいですか? UITableViewmyが its と一致していることを確認するのは私に任せるべきではありませんdataSourceか?
  • UITableViewController1 つ以上のセクションがあることを確認するためのチェックはどのプロパティですか(したがって、デリゲートにセクションの数を尋ねます)。numberOfSectionsInTableViewnumberOfSections = 0の場合だけでなく、モーダルから戻るたびに呼び出されるため、それ自体ではありません。
4

3 に答える 3

2

ドキュメントから:UITableViewController

テーブル ビューが最初にロードされて表示される直前に、テーブル ビュー コントローラーがテーブル ビューのデータをリロードします。 UITableViewControllerクラスはこれをスーパークラス メソッドで実装し ます。viewWillAppear:

デバッガーで見ると、アプリの起動時の2 番目の呼び出しはUITableViewControllerviewWillAppear:実装からのものです。具体的には、メッセージtableViewが送信される上記の部分です。reloadData

現在、on launchへの最初の呼び出しもの実装からのものですが、その実装の への呼び出しから直接ではありません。最初の電話の内容がよくわかりません。numberOfSectionsInTableView:UITableViewControllerviewWillAppear:-[UITableView reloadData]

しかし、あなたの質問に対して、numberOfSectionsInTableView:モーダルを閉じるときに発生する呼び出しは、 からの2 番目の呼び出しとまったく同じ呼び出しスタックを持っていますapplicationDidFinishLaunching:withOptions:。私の仮説は、UITableViewセクションがゼロであることを、まったくロードされていない状態にあると解釈するというものです。それは実際にはある程度の意味があります。「空の」テーブルビューはのないものと見なしますが、セクションのないビューはほとんど「初期化されていない」ように見えます。さらに、UITableViewDataSourceドキュメントUITableViewには、デフォルトで 1 つのセクションがあることが示されています。このメソッドからゼロを返すことは、ドキュメントのその仮定とも矛盾します。

ここで、アニメーションに関する懸念事項について説明します。作業するテーブルに空のセクションを指定すると、最初の行に必要なアニメーションを挿入することを完全に制御でき、必要なときにロックインされることはありません。リロードします。

この話の教訓は、なんらかの理由で本当に本当に必要でない限り、ゼロのセクションを返さないことだと思います。あなたの投稿のタイトルは、このテーブルビューも「空」であることを示していますが、フレームワークが空ではなくアンロードされているセクションをゼロで見つけることは明らかだと思います。

お役に立てれば!そして、私が遊んでみるためにサンプル プロジェクトを投稿していただきありがとうございます。

于 2012-09-08T06:17:52.360 に答える
1

おそらく代表者は自分の目を信じられなかったのでしょう。しかし、真面目な話、テーブル ビューには少なくとも 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 に答える