简体   繁体   中英

How to display UILabel when UIImage is not present

I have a UITableView where I am loading images from the sever. But sometimes there are no images to display on the UITableView and at that I want to display UILabel. Wondering how would I accomplish this. I would appreciate any help or code snippets to achieve this. Thank you very much!

I tried what you said. Everything works fine for the first time when you load the table, but as soon as you start scrolling all the labels and button go all over the places.
Here is my code.

- (UITableViewCell *)tableView:(UITableView *)tableView                         cellForRowAtIndexPath:(NSIndexPath *)indexPath
                {
                static NSString *CellIdentifier = @"Cell";
                UITableViewCell *cell = [self.tableView                                         dequeueReusableCellWithIdentifier:CellIdentifier];
                if (cell == nil) {
                cell = [[UITableViewCell alloc]                                                 initWithStyle:UITableViewCellStyleDefault                                       reuseIdentifier:CellIdentifier];
                cell.selectionStyle = UITableViewCellSelectionStyleNone;

                }
                if (msgImgFile){
                NSLog (@"Image file found!");
                lblOne = [[UILabel alloc] initWithFrame:CGRectMake(10, 360, 200,                20)];
                lblTwo = [[UILabel alloc] initWithFrame:CGRectMake(10, 378, 150,                20)];
                lblThree = [[UILabel alloc] initWithFrame:CGRectMake(10, 398,                   150, 20)];
                btnPlayStop.frame = CGRectMake(255.0f, 375.0f, 30.0f, 30.0f);
                }
                else 
                {
                NSLog(@"Image file not found. Simply load the UILabel and                       UIButton");
                lblOne = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, 200,                 20)];
                lblTwo = [[UILabel alloc] initWithFrame:CGRectMake(10, 68, 150,                 20)];
                lblThree = [[UILabel alloc] initWithFrame:CGRectMake(10, 88, 150,               20)];
                btnPlayStop.frame = CGRectMake(255.0f, 45.0f, 30.0f, 30.0f);

                }
                lblOne.font = [UIFont fontWithName:@"Arial" size:12];
                [lblOne setBackgroundColor:[UIColor clearColor]];
                lblOne.tag = 1;


                lblTwo.font = [UIFont fontWithName:@"Arial" size:12];
                [lblTwo setBackgroundColor:[UIColor clearColor]];
                lblTwo.tag = 2;

                lblThree.font = [UIFont fontWithName:@"Arial" size:10];
                [lblThree setBackgroundColor:[UIColor clearColor]];
                lblThree.tag = 3;

                lblFour = [[UILabel alloc] initWithFrame:CGRectMake(10, 24, 150,                20)];
                lblFour.font = [UIFont fontWithName:@"Arial" size:12];
                [lblFour setBackgroundColor:[UIColor clearColor]];
                lblFour.tag = 4;

                btnPlayStop = [UIButton buttonWithType:UIButtonTypeCustom];          
                [btnPlayStop setTitle:@"Play" forState:UIControlStateNormal];
                [btnPlayStop setImage:[UIImage imageNamed:@"Play Button.png"]                   forState:UIControlStateNormal];
                [btnPlayStop addTarget:self action:@selector(playRecordClicked:)                forControlEvents:UIControlEventTouchUpInside];

                [cell addSubview:lblOne];
                [cell addSubview:lblTwo];
                [cell addSubview:lblThree];
                [cell addSubview:lblFour];
                [cell.contentView addSubview:btnPlayStop];

                dispatch_queue_t queue =                                                        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
                dispatch_async(queue, ^{

                msgObjImg = (PFObject *)[self.imageDataMutArray                                 objectAtIndex:indexPath.row];
                createdDt = msgObjImg.createdAt;


                msgImgFile = [msgObjImg objectForKey:@"siqImage"];
                NSData *imgData = [msgImgFile getData];

                UIImage *msgImgFound = [UIImage imageWithData:imgData];              
                UIImage *newImg = [self scaleImage:msgImgFound                                  toSize:CGSizeMake(280.0, 300.0)];

                dispatch_sync(dispatch_get_main_queue(), ^{

                UILabel *dtTimeLabel = (UILabel *)[cell viewWithTag:3];
                NSDateFormatter *dtFormat = [[NSDateFormatter alloc]init];
                [dtFormat setDateFormat:@"MM-dd-yyyy HH:mm"];
                [dtFormat setTimeZone:[NSTimeZone                                               timeZoneForSecondsFromGMT:-18000]];
                NSString *createdDtString = [dtFormat stringFromDate:createdDt];
                dtTimeLabel.text = [NSString stringWithFormat:@"Received on:                    %@",createdDtString];
                [[cell imageView] setImage:newImg];
                [cell setNeedsLayout];
                }
                    return cell;

                }

I can see where the problem is, and can tell you the right procedure to solve this.

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

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

    lblOne = [[UILabel alloc]init];
   lblOne.tag = 1;

    lblTwo = [[UILabel alloc]init];
      lblTwo.tag = 2;
 lblThree = [[UILabel alloc]init];
     lblThree.tag = 3;
  lblFour = [[UILabel alloc]init];
     lblFour.tag = 4;
  btnPlayStop = [[UILabel alloc]init];
   btnPlayStop.tag = 5;

// Perform addition functions ( your requirements )

                [cell.contentView  addSubview:lblOne];
                [cell.contentView  addSubview:lblTwo];
                [cell.contentView  addSubview:lblThree];
                [cell.contentView  addSubview:lblFour];
                [cell.contentView addSubview:btnPlayStop];

    }
    else
    {
        lblOne = (UILabel*)[cell.contentView viewWithTag:1];
        lblTwo = (UILabel*)[cell.contentView viewWithTag:2];
        lblThree = (UILabel*)[cell.contentView viewWithTag:3];
        lblFour = (UILabel*)[cell.contentView viewWithTag:4];
        btnPlayStop = (UILabel*)[cell.contentView viewWithTag:5];

// AND SO ON ...
    }

// SET THE VALUES HERE FOR YOUR CONTENT VALUES

    return cell;
}

You need to create the cells using dynamic content views. Try the above snippet, and modify according to your own..

In your cellForRowAtIndexPath method

UIImage *image = [imagesArray objectAtIndex:indexPath.row];

if (image) {

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:yourImageViewFrame];//create desired Frame
    imageView.image = image;
    [cell addSubview:imageView];

} else {

    UILabel *label = [[UILabel alloc] initWithFrame:yourLabelFrame];//create desired frame
    label.text = @"No Image";
    [cell addSubview:label];

}

When your images are finished loading from the server, call [tableView reloadData];

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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