繁体   English   中英

重新加载tableView - Objective C

[英]Reloading tableView - Objective C

调用[self.tableView reloadData]; 我的cellForRowAtIndexPath将无法运行。

这就是发生的事情:

第一序列 -

- (void)startProcess:(NSInteger)number {
    NSInteger testing = number;
    cellID = testing;
    // MAKE REQuEST TO SERVER
    [self makeRequests];

}

第二顺序 -

-(void)makeRequests
{
/* GRAB USERNAME TO BE SENT OVER FOR NOTIFICATIONS */
NSArray *get = [[SSKeychain allAccounts] init];
NSString *username = [get[0] objectForKey:@"acct"];

NSDictionary *dictionary = @{@"function": @"populateNotfications", @"username" : username};
NSError *error = nil;
NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error];
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (error)
    NSLog(@"%s: JSON encode error: %@", __FUNCTION__, error);

NSURL *url = [NSURL URLWithString:@"mySite.com/dev/iphone/test.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

[request setHTTPMethod:@"POST"];
NSString *params = [NSString stringWithFormat:@"json=%@",
                    [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData *paramsData = [params dataUsingEncoding:NSUTF8StringEncoding];
[request addValue:@"8bit" forHTTPHeaderField:@"Content-Transfer-Encoding"];
[request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[paramsData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:paramsData];


// issue the request
NSURLResponse *response = nil;
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (error)
    NSLog(@"%s: NSURLConnection error: %@", __FUNCTION__, error);

// GRAB STATUS OBJECT
NSDictionary* json = [NSJSONSerialization
                      JSONObjectWithData:returnData //1

                      options:kNilOptions
                      error:&error];
self.impactsGrabed = [json objectForKey:@"requested_data"];
NSLog(@"grabbing data");
[self.tableView reloadData];
}

现在这将导致我的numberOfRowsInSection运行正常,但cellForRowAtIndexPath永远不会运行。 这是我的numberOfRowsInSection

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.impactsGrabed count];
}

impactsGrabed count将返回例如2。

tableView的输出:

<UITableView: 0x10e00ee00; frame = (0 20; 320 548); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x10c244950>; layer = <CALayer: 0x10c23ffc0>; contentOffset: {0, 0}>

更新:

细胞表格代码:

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.impactsGrabed count]; <!-- this does return an positive integer.
}

- (double) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 75;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"working cell");
    static NSString *CellIdentifier = @"timelineCell";
    impactTimelineCell *cell = (impactTimelineCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    cell = [[impactTimelineCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    [cell initTimelineCell];
    cell.statusLabel.text = [self.impactsGrabed[indexPath.row] objectForKey:@"message"];
    cell.timestampLabel.text = [self.impactsGrabed[indexPath.row] objectForKey:@"time_post"];

    return cell;
}

#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // WHEN CLICKING ON A NOTIFICATION FOR THE PAGE

}

这是我注意到的:

从另一个类调用函数startProcess ,它启动了加载tableView cells的整个过程,但它不起作用。 如果我在该文件中的viewDidLoad中调用startProcess方法,则在启动时, tableView cells会加载。

如果numberOfRowsInSection返回零,则不会调用cellForRowAtIndexPath。 只需通过调试代码确保numberOfRowsInSection返回非零值。

首先,不需要重新加载,因为您没有异步执行请求

//[self.tableView reloadData];

确保至少返回一个部分

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

检查self.tableViewdelegatedataSource是否未正确连接。

在得到Mr.rdelmar一些精彩帮助后, Mr.rdelmar 这就是问题:

因为我从ViewController的子container调用代码,所以我必须在startProcess启动以下startProcess

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
        NSInteger tag = cell.tag;
        impact* myScript = self.parentViewController.childViewControllers[1]; // if my script is one of the child view controllers, then this is how you need to access it -- the number might be 0,1 or 2 depending on which one is the impact controller
        [myScript startProcess:tag];
}

希望这可以帮助!

快乐的编码!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM