当我有多个部分时,如何用数字0启动我的UITableView部分?

时间:2012-09-17 07:51:12

标签: iphone objective-c ios xcode uitableview

=> 我知道,这是一个愚蠢的问题,但对于新的iPhone开发者而言,这对我来说更为重要。

这里我有与 UITableView部分相关的问题:

第一个问题:我有疑问如何从多个部分启动数字0的UITableView部分?

例如:

我在UITableViewnumberOfSectionsInTableView委托方法中有11个部分,我的部分首先从第11个部分开始,然后是0,1,2,3,4,5,6, 7,8,9和10。 那我怎么能用0号开始我的节号,然后照原样。

第二个问题:titleForHeaderInSection委托方法中,tableView的所有部分重复3次。并且在当前的ViewController中,我向上或向下滚动UITableView,然后在正常(0到11)部分显示UITableView的这个正常部分,在重复第3部分之后显示。

例如:

我在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];
}

提前致谢

3 个答案:

答案 0 :(得分:2)

你问:

  

第一个问题:我有疑问如何从多个部分开始我的UITableView部分编号为0?

我认为你的惊愕源于这些事实并非以严格顺序的方式调用。这就是它如何工作,你不能改变这种行为。显然,您的部分在应用程序中以正确的顺序显示,但它们恰好不会按顺序调用。这只是事件驱动编程的本质。但是,我在你的代码中看不到基于这个执行顺序的任何内容,但是你的代码中有些东西你没有包含在这里需要严格顺序调用这些方法,如果是这样,你会必须重构该代码。但我在上面的代码片段中没有看到类似内容。 UITableViewDataSource委托方法的本质意味着您可以(并且应该)以这样的方式编写方法,即它们不依赖于调用单元格或节的顺序。永远不要依赖UI中的事件序列来管理构建视图底层模型的方式。

  

第二个问题:在titleForHeaderInSection委托方法中,tableView的所有部分重复3次。并且在当前的ViewController中,我向上或向下滚动UITableView,然后按照正常(0到11)显示UITableView的正常部分,重复第3部分后显示。

如果连续三次被召唤,我会感到惊讶。我下注(特别是考虑到你的日志显示了格式NSLog语句稍有不同的证据),你的代码中有其他NSLog语句。我会尝试将您的NSLog语句更改为:

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

这样,(a)您知道从哪个方法进行记录; (b)通过在格式化字符串中添加描述性"section=",这意味着如果您永远不会对记录的数字感到困惑。我愿意打赌,并非所有这三个NSLog陈述都来自您的titleForHeaderInSection。就个人而言,我不再在没有NSLog引用的情况下将__FUNCTION__语句放在我的代码中,因为很容易混淆产生NSLog语句的内容。

但即使多次调用titleForHeaderInSection,那又如何呢? iOS已经在幕后进行了优化以完成各种各样的事情。对我们来说理解正在发生的事情是有好处的(例如,确保你不会像titleForHeaderInSection中的某些计算密集型或网络密集型活动那样做一些愚蠢的事情),但现在是时候接受serenity prayer和欣赏我们作为开发人员可以控制的东西,以及我们不能控制的东西。 (并且UITableViewDataSource调用的顺序和数量是我们无法控制的事情之一。)只要您不是对方法进行冗余调用的来源(例如,执行不必要的reloadData电话),我不担心。

总而言之,如果连续三次调用titleForHeaderInSection我会感到惊讶,不要只依赖它被调用一次。我认为表格视图可能会为表格的每个部分调用一次(可能需要做出类似于整个表格的高度以便滚动条的大小适当),然后再次对屏幕上可见的部分进行调整(实际显示节标题)。

答案 1 :(得分:0)

-(NSInteger)numberOfRowsInTotal
{

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

return cellCount;
 }

答案 2 :(得分:0)

这不是正确的方法,但你可以使用下面的代码及其完美的工作。

[self reloadDataWithCompletion:^{
            communityFoundIndex = [[NSMutableArray alloc]init];
            NSRange range = NSMakeRange(0, 1);
            NSIndexSet *section = [NSIndexSet indexSetWithIndexesInRange:range];
            [self.myTbl reloadSections:section withRowAnimation:UITableViewRowAnimationNone];
        }];

- (void) reloadDataWithCompletion:( void (^) (void) )completionBlock {
    [_tblCommunity reloadData];
    if(completionBlock) {
        completionBlock();
    }
}