UITableview图像问题

时间:2014-02-12 16:20:37

标签: ios objective-c uitableview

我试图让图像在UITableView中工作 - 如果可能的话,你可以查看代码,看看为什么我无法在cellForRowAtINdexPath中检索数组LogoURL,这也是正确的方法吗?非常感谢大家。杰森。

- (void)viewDidLoad
    {

        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        self.client = [MSClient clientWithApplicationURLString:@"
                                                applicationKey:@""];
        self.table = [self.client tableWithName:@"notifications"];
        self.rowitems = [[NSMutableArray alloc] init];
        MSQuery *query = [self.table query];
        query.fetchLimit = 3;
        [query readWithCompletion:^(NSArray *items, NSInteger totalCount, NSError *error)
         {
             //add the items to our local cop
             self.rowitems = [items mutableCopy];
            [self.TableView reloadData];
         }];
    }


    - (void)SQLRetrieve:(NSString *)barID

    {
        //NSLog(@"%@", barID);

        NSDictionary *barIDDictionary = @{ @"myParam": barID};
        self.client = [MSClient clientWithApplicationURLString:@"https://outnight-mobile.azure-mobile.net/" applicationKey:@"okYeRGfBagYrsbkaqWIRObeDtktjkF10"];
        [self.client invokeAPI:@"photos"
                          body:barIDDictionary
                    HTTPMethod:@"POST"
                    parameters:nil
                       headers:nil
                    completion:^(id result, NSHTTPURLResponse *response, NSError *error) {
                        if (error) {
                            NSLog(@"Error %@", error );
                        } else
                        {
                            NSString *string = [NSString stringWithFormat:@"%@", [result objectForKey:@"rows"]];
                            NSString *stringWithoutbracketsend = [string stringByReplacingOccurrencesOfString:@")" withString:@""];
                            NSString *stringWithoutbracketsfront = [stringWithoutbracketsend stringByReplacingOccurrencesOfString:@"(" withString:@""];
                            NSString *completion = [stringWithoutbracketsfront stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
                            NSString *newStr = [completion substringFromIndex:1];
                            NSString *finalstring = [newStr substringToIndex:newStr.length-(newStr.length>0)];


                            dispatch_async( dispatch_get_main_queue(), ^{
                                [self doSomethingWithReturnString:finalstring];
                            });
                        }
                    }];
    }


    -(void)doSomethingWithReturnString:(NSString*)string
    {
        self.LogoURL = [[NSMutableArray alloc] init];
        [self.LogoURL addObject:string];
        NSLog(@"%@", self.LogoURL);


    }


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

    - (NSInteger)tableView:(UITableView *)tableView
     numberOfRowsInSection:(NSInteger)section {
        return [self.rowitems count];
        NSLog(@"%d",[self.rowitems count]);

    }


    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {

            UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
            NSDictionary *apt = [self.rowitems objectAtIndex:indexPath.row];
            cell.textLabel.text = apt[@"content"];
            [self SQLRetrieve:apt[@"barID"]];
            return cell;

    }

3 个答案:

答案 0 :(得分:0)

我这样做了。制作了我自己的单元格类(notecell)。

在类注释单元格中定义单元格视图的方法是自身的初始化:

 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self)
    {
        // Initialization code
        _dateLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 50)];
        _noteLabel = [[UILabel alloc]initWithFrame:CGRectMake(110, 0, 200, 50)];
        [self addSubview:_noteLabel];
        [self addSubview:_dateLabel];
    }
    return self;
}

        - (void)setDateLabelValue:(NSString *)dateValueString
    {
        _dateLabel.text = dateValueString;
    }

    - (void)setNoteLabelValue:(NSString *)noteValueString
    {
        _noteLabel.text = noteValueString;
    }

在这里,我在tableview中使用它

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";
    NoteCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[NoteCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier:CellIdentifier];
    }
    NSDictionary *oneDict = [_noteBookArray objectAtIndex:indexPath.row];

    [cell setDateLabelValue:[oneDict objectForKey:@"timestamp"]];
    [cell setNoteLabelValue:[oneDict objectForKey:@"value"]];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}

这对你有帮助吗?

答案 1 :(得分:0)

数组为零的原因是因为[self.client invokeAPI..]方法使用了回调 - 我认为您会发现cellForRowAtIndexPath方法在完成处理程序完成之前完成。这基本上是一种竞争条件。

要在rowForIndexPath中测试此位置,在完成处理程序中测试一个断点。我认为您会发现rowForIndexPath在完成块之前完成执行。

你的数组将是nil,直到完成块调用doSomethingWithReturnString,我相信它会在之后发生。

我建议你将[table reloadData]移到SQLRetriveCode中的补充处理程序中,这样只有在填充数组后才会调用cellForRowAtrIndexPath。然后,您还需要将SQLRetriveCode移出cellForRowAtrIndexPath,否则永远不会被调用。我会把它放在你想要放置的位置,可能在viewDidLoad的完成块中(如果只是为了测试它修复它)

答案 2 :(得分:0)

任何表视图图像加载问题都归结为以下步骤:

  1. 将数据加载到数据源 - 来自REST /数据库
  2. 创建并初始化相关数据模型对象
  3. [tableView reloaddata]
  4. cellForRowAtIndexPath内,包含将从正确的数据模型对象设置图像的代码。由于表视图完成了单元重用,因此这一步可能不太古怪。
  5. 为避免出现问题,请参阅表格视图中的this tutorial about lazy loading图像。