4

=>わかっています、これはばかげた質問ですが、これは私のように新しい iPhone 開発者にとってより重要です。

ここで、 UITableViewセクションに関連する質問があります:

最初の問題:複数のセクションから番号 0 で UITableView セクションを開始するにはどうすればよいかという質問があります。

例えば ​​:

私はデリゲートメソッドで11のセクション番号を持っていますUITableView.numberOfSectionsInTableView私のセクションは最初にセクションの11番目の番号で始まり、次に0,1,2,3,4,5,6,7,8,9と10です。私のセクション番号は0番号で、そのままです。

2番目の問題:デリゲートメソッドでtitleForHeaderInSectionは、tableViewのすべてのセクションが3回繰り返されます。現在のViewControllerで、UITableViewを上下にスクロールし、セクションを通常(0〜11)として表示します。セクションを3回繰り返した後、UITableViewのこの通常のセクションが表示されます。

例えば ​​:

私はデリゲートメソッドで使用NSLog (@" %d ", section );titleForHeaderInSection、以下のようにコンソールに出力を表示します

コンソール出力:

2012-09-17 12:27:47.424 Quotes2You[1623:f803]  11 
2012-09-17 12:27:47.426 Quotes2You[1623:f803]  11 
2012-09-17 12:27:47.427 Quotes2You[1623:f803] 11
2012-09-17 12:27:47.428 Quotes2You[1623:f803]  0 
2012-09-17 12:27:47.429 Quotes2You[1623:f803]  0 
2012-09-17 12:27:47.429 Quotes2You[1623:f803] 0
2012-09-17 12:27:47.430 Quotes2You[1623:f803]  1 
2012-09-17 12:27:47.431 Quotes2You[1623:f803]  1 
2012-09-17 12:27:47.431 Quotes2You[1623:f803] 1
2012-09-17 12:27:47.432 Quotes2You[1623:f803]  2 
2012-09-17 12:27:47.433 Quotes2You[1623:f803]  2 
2012-09-17 12:27:47.433 Quotes2You[1623:f803] 2
2012-09-17 12:27:47.434 Quotes2You[1623:f803]  3 
2012-09-17 12:27:47.435 Quotes2You[1623:f803]  3 
2012-09-17 12:27:47.436 Quotes2You[1623:f803] 3
2012-09-17 12:27:47.436 Quotes2You[1623:f803]  4 
2012-09-17 12:27:47.437 Quotes2You[1623:f803]  4 
2012-09-17 12:27:47.438 Quotes2You[1623:f803] 4
2012-09-17 12:27:47.438 Quotes2You[1623:f803]  5 
2012-09-17 12:27:47.439 Quotes2You[1623:f803]  5 
2012-09-17 12:27:47.439 Quotes2You[1623:f803] 5
2012-09-17 12:27:47.440 Quotes2You[1623:f803]  6 
2012-09-17 12:27:47.441 Quotes2You[1623:f803]  6 
2012-09-17 12:27:47.462 Quotes2You[1623:f803] 6
2012-09-17 12:27:47.463 Quotes2You[1623:f803]  7 
2012-09-17 12:27:47.464 Quotes2You[1623:f803]  7 
2012-09-17 12:27:47.465 Quotes2You[1623:f803] 7
2012-09-17 12:27:47.466 Quotes2You[1623:f803]  8 
2012-09-17 12:27:47.466 Quotes2You[1623:f803]  8 
2012-09-17 12:27:47.467 Quotes2You[1623:f803] 8
2012-09-17 12:27:47.472 Quotes2You[1623:f803]  9 
2012-09-17 12:27:47.476 Quotes2You[1623:f803]  9 
2012-09-17 12:27:47.478 Quotes2You[1623:f803] 9
2012-09-17 12:27:47.480 Quotes2You[1623:f803]  10 
2012-09-17 12:27:47.481 Quotes2You[1623:f803]  10 
2012-09-17 12:27:47.481 Quotes2You[1623:f803] 10
2012-09-17 12:27:47.487 Quotes2You[1623:f803]  0 
2012-09-17 12:27:47.487 Quotes2You[1623:f803]  1 
2012-09-17 12:27:47.489 Quotes2You[1623:f803]  2 

最初にすべてのセクションを 3 回繰り返し、UITableView をスクロールした後、セクションを 0 から開始します (通常どおり)。

私のコードはここにあります:

ThirdViewController.h

@interface ThirdViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>
{
       UITableView *tblCustomer;
        NSArray *listOfsection;
}
@property (nonatomic,retain) UITableView *tblCustomer;
@property (nonatomic,retain) NSArray *listOfsection;

@end

ThirdViewController.m

@synthesize tblCustomer , listOfsection;

- (void)viewDidLoad
{
    [super viewDidLoad];

     self.tblCustomer = [[UITableView alloc] initWithFrame:CGRectMake(0,0,320,417) style:UITableViewStyleGrouped];
    self.tblCustomer.delegate = self;
    self.tblCustomer.dataSource = self;
    [self.view addSubview:self.tblCustomer];

    self.listOfsection = [[NSArray alloc]  initWithObjects:@"Name", @"Company", @"Address", @"Email", @"Mobile", @"Phone", @"Potential", @"Sales Status", @"Genre", @"Distributor", @"Dist Rep", @"Internal Notes", nil];

}

#pragma mark - UITableView Datasource Methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)aTableView {
    return [self.listOfsection count];
}

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section
{
    int numSection=0;

      if (section == 2)
        numSection = 5;
    else
        numSection = 1;

    return numSection;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        // here is my code cellForRowAtIndexPath as section wise 
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSLog(@" %d ", section);
     NSString *sectionHeader = nil;

    sectionHeader = [self.listOfsection objectAtIndex:section];

    // here is section overwrite //

      return sectionHeader;
}

#pragma mark - Memory Management

-(void)dealloc
{
    [super dealloc];

    [self.listOfsection release];
    [self.tblCustomer release];
}

前もって感謝します

4

3 に答える 3

2

あなたが尋ねる:

最初の問題: 複数のセクションから番号 0 で UITableView セクションを開始するにはどうすればよいかという質問があります。

あなたの驚きは、これらが厳密に連続した方法で呼び出されないという事実に起因すると思います。これがたまたま機能する方法であり、この動作を変更することはできません。明らかに、セクションはアプリ内で正しい順序で表示されますが、順番に呼び出されるわけではありません。これがイベント駆動型プログラミングの性質です。しかし、あなたのコードには、この実行順序に基づいて壊れるものは何もありませんが、おそらくコードには、ここに含まれていない、これらのメソッドの厳密な順次呼び出しを必要とする何かが含まれている可能性があります。そのコードをリファクタリングする必要があります。しかし、上記のコード スニペットにはそのようなものは何もありません。の性質UITableViewDataSourceデリゲート メソッドとは、セルまたはセクションが呼び出される順序に依存しない方法でメソッドを記述できる (および記述する必要がある) ことを意味します。ビューの基礎となるモデルの構築方法を制御するために、UI からの一連のイベントに依存しないでください。

2番目の問題:titleForHeaderInSectionデリゲートメソッドでは、tableViewのすべてのセクションが3回繰り返されます。現在のViewControllerで、UITableViewを上下にスクロールし、セクションを通常(0〜11)として表示します。セクションを3回繰り返した後、UITableViewのこの通常のセクションが表示されます。

3回続けて呼び出されたらビックリです。コードのどこかにNSLog他のステートメントがあることに賭けたいと思います (特に、ログがわずかに異なる形式のステートメントの証拠を示している場合)。NSLogあなたのNSLogステートメントを次のように変更してみます。

NSLog(@"%s section=%d", __FUNCTION__, section);

このようにして、(a) どのメソッドからログが記録されているかがわかります。(b)"section="書式設定文字列に説明を追加することで、ログに記録されている数値について混乱することがないことを意味します。これら 3 つのNSLogステートメントのすべてがあなたのtitleForHeaderInSection. 個人的にはNSLog、参照なしでステートメントをコードに入れることはもうありません。なぜなら、何がどのステートメントを__FUNCTION__生成しているのか混乱しやすいからです。NSLog

しかし、titleForHeaderInSection複数回呼び出されたとしても、だから何ですか? iOS は、あらゆる種類の処理を行うために舞台裏で最適化されています。何が起こっているのかを理解することは私たちにとって良いことですが (たとえば、.NET で計算集約型またはネットワーク集約型のアクティビティのようなばかげたことをしないようにするなど)、これは静けさの祈りtitleForHeaderInSectionを受け入れ、開発者として制御できるものに感謝する時です。 、そして私たちが持っていないもの。(そして、呼び出しの順序と数は、私たちが制御できないものの 1 つです。) あなたがメソッドへの冗長な呼び出しのソースでない限り (例えば、不要な呼び出しを行う)、私はそれについて心配しません。 .UITableViewDataSourcereloadData

要約すると、 が 3 回連続して呼び出されたら驚くtitleForHeaderInSectionかもしれませんが、1 回だけ呼び出されることに依存しないでください。テーブルビューは、テーブルのセクションごとに1回呼び出して(おそらくテーブル全体の高さを把握して、スクロールバーのサイズが適切になるようにするなど)、画面に表示されているセクションに対してもう一度呼び出すことができると思います(実際にセクション ヘッダーを表示するため)。

于 2012-09-17T14:13:39.847 に答える
0
-(NSInteger)numberOfRowsInTotal
{

  NSInteger sections = self.numberOfSections;
  NSInteger cellCount = 0;
  for (NSInteger i = 0; i < sections; i++) 
 {
    cellCount += [self numberOfRowsInSection:i];
 }

return cellCount;
 }
于 2012-09-17T10:54:51.270 に答える