1

我有一个UITableView使用NSMutableArray. 向下滚动时会更新,这tableview是通过向NSMutableArray. 我面临的问题是,每当我从这个页面导航到另一个页面然后再返回时,tableview无论我做了多少更新,都会将其设置为数组的初始大小(这意味着如果我每次加载十个对象,则即使数组大小为 30,tableview 大小也会恢复为 10,注意:数组大小永远不会改变,只有表内容大小会改变)。我开始相信这与NSMutableArray. 代码的要点是这样的:

@interface FlowViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
{
    UITableView *flowTable;

    NSMutableArray *cellData;

}
@property(nonatomic, retain) IBOutlet UITableView *flowTable;

@property(nonatomic, retain) NSMutableArray *cellData;

- (void) getData;
- (void) storeData: (NSMutableArray*) arr; 

@end

@implementation FlowViewController

@synthesize cellData;

@synthesize flowTable;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.flowTable.autoresizingMask = UIViewAutoresizingFlexibleHeight;

    [self.flowTable setDataSource:self];
    [self.flowTable setDelegate:self];

    self.cellData = [[NSMutableArray alloc] init];

    [self getData];
}

- (void) storeData:(NSMutableArray *)arr
{
    for(NSDictionary *data in arr)
    {

        CellObject *det = [[CellObject alloc] init];

        // store details

        [self.cellData addObject: det];

    }

    [self.flowTable reloadData];
}

- (void) getData
{

    NSString *url = @"http://example.com/";

    NSMutableURLRequest *theRequest= [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
                                                             cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                     timeoutInterval:10.0];

[theRequest setHTTPMethod:@"GET"];

flowConnection =[[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];

}


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

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

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

    return [self.cellData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *CellIdentifier = @"FlowCell";

    MyFlowCell *cell = (MyFlowCell *)[self.flowTable dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"FlowCell" owner:nil options:nil];
       // cell = [nib objectAtIndex:0];

        for(id currentObject in nib)
        {

        if([currentObject isKindOfClass:[MyFlowCell class]])

        {
            cell = (MyFlowCell *)currentObject;

        break;
    }
    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

}

CellObject *rowItem = [cellData objectAtIndex:indexPath.row];

    // set cell data

}

    return cell;
}


- (void)tableView:(UITableView *)tableViewdidSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];

    self.current = indexPath.row;

    [self performSegueWithIdentifier:@"flowToAnotherSegue" sender:nil];

}


- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    if ([segue.identifier isEqualToString:@"flowToAnotherSegue"])
    {
        NewViewController *iv =
            segue.destinationViewController;

    iv.current = self.current;
        iv.data = self.cellData;

    }

}


#pragma mark -
#pragma NSURLConnection Delegate Methods
- (void) connection:(NSURLConnection *)_connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"Receiving response: %@, status %d", [(NSHTTPURLResponse*)response allHeaderFields],     [(NSHTTPURLResponse*) response statusCode]);
    receivedData = [NSMutableData data];
}

- (void) connection:(NSURLConnection *)_connection didFailWithError:(NSError *)error {
    NSLog(@"Connection Failed: %@", error);   
}

- (void) connection:(NSURLConnection *)_connection didReceiveData:(NSData *)_data {

       [receivedData appendData:_data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    // get the new NSMutableArray from receivedData

    [self storeData: newMutableArray];

}


#pragma mark -
#pragma mark Deferred image loading (UIScrollViewDelegate)

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {

    if(Bottom reached) {

       // load more data

        [self getData];

        }

    }
}

@end

我希望这不是太多。请告诉我我可能会出错的地方。

4

5 回答 5

1

将数组存储在共享类/单例类中。您可以创建自己的共享类,也可以使用appDelegate.

  • 在 appDelegate 中声明一个NSMutableArray属性。@property (nonatomic, strong) NSMutableArray *cellData; 并合成它。

  • 使用这个数组而不是你的 cellData 数组。 AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];替换你self.cellDataappDelegate.cellData

于 2013-01-14T12:01:28.333 回答
1

将数组存储在共享类/单例类中。

每当您重新加载此页面时,viewDidLoad都会调用并且您的数组是 alloc+init 再次完成,将其设置为其默认值。

于 2013-01-14T11:03:40.647 回答
0

您的数组正在 viewDidLoad 上重新创建,您可以在分配之前检查它是否已经存在。

if (!self.cellData) {
    self.cellData = [[NSMutableArray alloc] init];
    [self getData];
}
于 2013-01-14T11:30:10.803 回答
0

由于我找不到我的代码出了什么问题,我做了一个临时修复。就像我说的,NSMutableArray cellData 没有改变,但唯一改变的是 UITableView 本身(我在 viewDidDisappear 方法中找到了这个)。所以我这样做只是为了弥补这一点

 - (void) viewDidAppear:(BOOL)animated
{
    [self.flowTable reloadData];

    [self.flowTable scrollToRowAtIndexPath: lastIndex atScrollPosition:0 animated: NO];

}

这会将 flowTable 返回到最后选择的单元格。它并不优雅,但它有效。请继续发表你的想法。我真的很想弄清楚这一点。

于 2013-01-14T13:10:39.380 回答
0

如果您self.cellData = [[NSMutableArray alloc] init];从视图中删除确实加载并使用 JIT 方法创建自己的 getter:

-(NSMutableArray *)cellData
{
    if(!_cellData){
        _cellData = [NSMutableArray array];
    }
    return _cellData;
}

cellData 的内容将被保留,直到 FlowController 被释放。

于 2013-01-14T11:10:10.613 回答