问题重新加载cellForRowAtIndexPath - 目标C.

时间:2014-04-01 23:10:38

标签: ios objective-c uitableview

在从外部类调用以启动方法并重新加载tableView时,我遇到了重新加载tableView的问题

更具体地说:

以下是来自外部课程的电话:

    - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
        NSInteger tag = cell.tag;
        impact* myScript = [[impact alloc] init];
        [myScript startProcess:tag];
    }
**From here** it moves to the `impact` class and loads the `startProcess` method:

    - (void)startProcess:(NSInteger)number {
        NSInteger testing = number;
        cellID = testing;
        // MAKE REQuEST TO SERVER
        [self makeRequests];
       dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.tableView reloadData];
       });

    }

这是它调用的makeRequests方法:

-(void)makeRequests
{
    /* GRAB USERNAME TO BE SENT OVER FOR NOTIFICATIONS */
    NSArray *get = [[SSKeychain allAccounts] init];
    //NSLog(@"get%@", get);
    NSString *username = [get[0] objectForKey:@"acct"];
    //if(cellID != 0)
    //{
        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:@"test.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"];
    //}


}

现在从这里开始运行我的 tableView方法,如下所示:

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

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

- (double) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 75;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    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;
}

我记录了每个方法,每个方法都有效,直到我点击cellForRowAtIndexPath没有发生任何事情。什么都没有回归无效。现在就是这件事:

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

例如:

如果我将[self startProcess:1];放在viewDidLoad内,那就完美了!如果我从另一个班级拨打[myScript startProcess:tag];,它就无法正常工作。

你们认为这个问题是什么?

1 个答案:

答案 0 :(得分:1)

由于您的所有控制器都已经实例化并且在屏幕上显示,因此您不需要实例化一个控制器(实际上您不应该这样做,因为这会创建一个不在屏幕上的新实例)。 / p>

- (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];
}

您也可以在prepareForSegue中执行此操作 - 当您的控制器被实例化时,所有嵌入式子控制器也将是,并且您可以从segue的destinationViewController属性获取对它们的引用。

由于此控制器已在屏幕上,因此可以在startProcess中调用reloadData。