当我在tableView的最后一行单击“更多数据...”时,TableView不会重新加载数据

时间:2012-03-19 15:59:52

标签: ios uitableview reloaddata

请求我的测试webService获取数据

tableView的最后一行是“更多数据......”

单击此行时,发送另一个请求以获取更多数据,

我多次使用[tableView reloaddata],但没有什么

发生了,我不知道为什么。所以,请帮我解决这个问题。

提前谢谢。

并且有我的tableViewController.h类:

#import <UIKit/UIKit.h>

#import "NoticeDetailViewController.h"

@interface NoticeViewController : UIViewController
<UITableViewDataSource,UITableViewDelegate>
{    
    NSMutableArray *allNoticeArray;

    NSArray *addNoticeArray;

    NSInteger totalNotice;

    NSInteger pageIndex;

    UITableView *tableView;
}

@property (nonatomic, retain) NSMutableArray *allNoticeArray;
@property (nonatomic, retain) NSArray *addNoticeArray;
@property NSInteger totalNotice;
@property NSInteger pageIndex;
@property (nonatomic, retain) UITableView *tableView;
- (NSMutableArray *)getNoticeList :(NSInteger)pageIndex;
@end

和tableViewController.m类:

#import "NoticeViewController.h"
#import "Notice.h"
#import "OAURLEncodingAdditions.h"
@interface NoticeViewController ()
@end

@implementation NoticeViewController
@synthesize allNoticeArray;
@synthesize addNoticeArray;
@synthesize pageIndex;
@synthesize tableView;
@synthesize totalNotice;

- (NSMutableArray *)getNoticeList :(NSInteger)pageIndex
    { 
        AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        NSString *userId = appDelegate.user.userId;
        NSString *departmentId = appDelegate.user.departmentId;

        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://xxx.xxx.xx.xx/FMS/Pages/Service/FMService.svc/GetAnnouncement?userId=%@&departmentId=%@&pageIndex=%d&pageSize=%d",userId,departmentId,self.pageIndex,1]];
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        [request setValidatesSecureCertificate:NO];
        [request startSynchronous];
        NSError *error = [request error];
        if (!error) 
        {
            NSString *responseString = [request responseString];
            NSDictionary *responseDict = [responseString JSONValue];
            NSArray *noticeArray = [responseDict objectForKey:@"d"];

            NSMutableArray *arrayOfAllNotice = [[NSMutableArray alloc] init];

            for (NSDictionary *noticeDic in noticeArray) 
            {
                NSString *body = [noticeDic objectForKey:@"Body"];
                NSString *departmentName = [noticeDic objectForKey:@"DepartmentName"];
                NSString *noticeId = [noticeDic objectForKey:@"Id"];
                NSString *isTop = [noticeDic objectForKey:@"IsTop"];
                NSString *readState = [noticeDic objectForKey:@"ReadState"];
                NSString *realName = [noticeDic objectForKey:@"RealName"];
                NSString *title = [noticeDic objectForKey:@"Title"];

                int noid = [noticeId intValue];
                int isto = [isTop intValue];
                int read = [readState intValue];

                Notice *notice = [[Notice alloc] initWithBody:body 
                                       departmentName:departmentName 
                                             noticeId: noid 
                                                isTop:isto 
                                            readState:read 
                                             realName:realName 
                                                title:title];
                [arrayOfAllNotice addObject:notice];
            }
        self.addNoticeArray = [[NSArray alloc] initWithArray:arrayOfAllNotice];
    }
    else
    {
       ....
    }
    [allNoticeArray addObjectsFromArray:addNoticeArray];    
    NSLog(@"allNoticeArray count: %d",[allNoticeArray count]);  //Here:When the last row clicked, the number changes:1->2  
    [self.tableView reloadData]; 
    return allNoticeArray;
}

#pragma mark - 
#pragma mark Table View Data Source Methods

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSInteger theNumberOfRowsInSection;

    if ( [allNoticeArray count] < (self.totalNotice)) 
    {
        theNumberOfRowsInSection = [allNoticeArray count]+1;
    }
    if ( [allNoticeArray count] == (self.totalNotice)) 
    {
        theNumberOfRowsInSection = [allNoticeArray count];
    }

    return theNumberOfRowsInSection; 
}

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView reloadData];

    static NSString *NoticeListTableIdentifier = @"NoticeListTableIdentifier";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:NoticeListTableIdentifier];
    if ( cell == nil ) 
    {
        cell = [[[UITableViewCell alloc]
             initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NoticeListTableIdentifier] autorelease];
    }

    if ( [allNoticeArray count] < (self.totalNotice) ) 
    {
        if ( [indexPath row] != [allNoticeArray count]) 
        {
            NSUInteger row = [indexPath row];
            Notice *noticeOfTheRow = [allNoticeArray objectAtIndex:row];
            NSString *title = noticeOfTheRow.title;
            cell.textLabel.text = title;
        }
        else 
        {
            cell.textLabel.text = @"More...";
        }
    }
    if ( [allNoticeArray count] == (self.totalNotice) ) 
    {
        NSUInteger row = [indexPath row];
        Notice *noticeOfTheRow = [allNoticeArray objectAtIndex:row];
        NSString *title = noticeOfTheRow.title;
        cell.textLabel.text = title;
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ( [indexPath row] != [allNoticeArray count]) 
    {        
        NSUInteger row = [indexPath row];       
        Notice *notice = [allNoticeArray objectAtIndex:row];        
        NSString *noticeDetailTitle = notice.title;        
        NoticeDetailViewController *noticeDetailViewController = [[[NoticeDetailViewController alloc] init] autorelease];
        noticeDetailViewController.title = noticeDetailTitle;        
        ticeDetailViewController.noticeIdForGet = notice.noticeId;        
        [self.navigationController pushViewController:noticeDetailViewController animated:YES];        
    }
    if ( [indexPath row] == [allNoticeArray count]) 
    {        
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
        hud.labelText = @"reload...";        
        self.pageIndex ++;        
        [self getNoticeList:self.pageIndex];        
        [self.tableView reloadData];        
        [MBProgressHUD hideHUDForView:self.view animated:YES];        
    }
}

- (void)pushBack
{
    [self dismissModalViewControllerAnimated:YES];
}

- (void)viewDidLoad
{
    [super viewDidLoad];  
    self.allNoticeArray = [[NSMutableArray alloc] init];
    self.pageIndex = 1;    
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.labelText = @"reload...";    
    self.title = @"Notice";    
    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"back" 
                                                                       style:UIBarButtonItemStyleBordered 
                                                                      target:self 
                                                                      action:@selector(pushBack)];
self.navigationItem.leftBarButtonItem = leftButton;


    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"reload" 
                                                                      style:UIBarButtonItemStyleBordered 
                                                                     target:self 
                                                                     action:@selector(reloadNotice)];
    self.navigationItem.rightBarButtonItem = rightButton;
    self.allNoticeArray = [self getNoticeList:self.pageIndex];    
    [MBProgressHUD hideHUDForView:self.view animated:YES];
 }
@end

2 个答案:

答案 0 :(得分:0)

变化:

if ( [indexPath row] == [allNoticeArray count])

为:

if ( [indexPath row] == [allNoticeArray count]-1)

原因是数组(和行)索引是基数0.所以如果一个数组有3个对象,那么最后一个对象的索引是2

答案 1 :(得分:0)

BTW,使用新的语言功能,无需在界面中声明ivars。如果您已经声明了属性并合成它们,编译器将处理它们。

@interface NoticeViewController : UIViewController
<UITableViewDataSource,UITableViewDelegate>
{    
    NSMutableArray *allNoticeArray;

    NSArray *addNoticeArray;

    NSInteger totalNotice;

    NSInteger pageIndex;

    UITableView *tableView;
}
//...
@end