UILabel in UITableViewCell to make a customised cell without making separate class

若如初见. 提交于 2019-12-12 05:03:12

问题


In my table view cell i need to display the contents of my array elements in a single cell and if i insert any new contents the previous contents are not to be overwritten.The previous content and my new content should be displayed in order.Here is my code

- (void)viewDidLoad
{
[super viewDidLoad];




NSMutableArray *arrMain=[NSMutableArray arrayWithObjects: cnfqty, cnftitle, cnfrate, nil];

finarray=[[NSMutableArray alloc]init];
[finarray addObjectsFromArray:arrMain];
   NSLog(@"%@",finarray);


}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
 }

 #pragma mark - Table view data source

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 {

// Return the number of sections.
return 1;
}

 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
 {

return 150.0;

 }

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
 // Return the number of rows in the section.
return ( [finarray count] / 3 ); 
}


 - (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier {

UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

UILabel *tempLabel;
//UIImage *tempImage;

/* Create UI elements - Customize as you want your text to appear */

CGRect myFirstLabel = CGRectMake (65, 10, 200, 15);
CGRect mySecondLabel = CGRectMake (65, 25, 200, 15);
CGRect myThirdLabel = CGRectMake (65, 40, 200, 15);
 //  CGRect myImage = CGRectMake (10, 10, 50, 50);

//Initialize first label
tempLabel = [[UILabel alloc] initWithFrame: myFirstLabel];
tempLabel.tag = 1;
tempLabel.font = [UIFont boldSystemFontOfSize:12];
tempLabel.textColor = [UIColor lightGrayColor];
[cell.contentView addSubview: tempLabel];

//Initialize second label
tempLabel = [[UILabel alloc] initWithFrame: mySecondLabel];
tempLabel.tag = 2;
tempLabel.font = [UIFont boldSystemFontOfSize:12];
tempLabel.textColor = [UIColor lightGrayColor];
[cell.contentView addSubview: tempLabel];

//Initialize third label
tempLabel = [[UILabel alloc] initWithFrame: myThirdLabel];
tempLabel.tag = 3;
tempLabel.font = [UIFont boldSystemFontOfSize:12];
tempLabel.textColor = [UIColor lightGrayColor];
[cell.contentView addSubview: tempLabel];

//Initialize your picture
//imgTemp = [[UIImageView alloc] initWithFrame: myImage];
//imgTemp.tag = 4;
//[cell.contentView addSubview: tempImage];

return cell;
 }

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [self getCellContentView: CellIdentifier];
}

//This will create the actual UI elements
UILabel *tempLabel1 = (UILabel *)[cell viewWithTag: 1];
UILabel *tempLabel2 = (UILabel *)[cell viewWithTag: 2];
UILabel *tempLabel3 = (UILabel *)[cell viewWithTag: 3];
//UIImageView *tempImage = (UIImageView *)[cell viewWithTag: 4];

// Populate the labels
NSString *firstText = [NSString stringWithString: [finarray objectAtIndex: 3*(indexPath.row)]];
NSString *secondText = [NSString stringWithString: [finarray objectAtIndex: 3*(indexPath.row) + 1]];
NSString *thirdText = [NSString stringWithString: [finarray objectAtIndex: 3*(indexPath.row) + 2]];

// Populate the picture
//UIImage *picture = [[UIImage alloc] initWithData:theObjectToPutInCell.picture];

tempLabel1.text = firstText;
tempLabel2.text = secondText;
tempLabel3.text = thirdText;

 // tempImage.image = picture;

return cell;  


}
}

@end

The problem which i'm facing with my code is each string is displayed in each cell and if i insert any new string previous contents are gone and only new contents are displayed.

To get clear idea about this question i'm trying to implement "add to cart" service for online shopping.As per concept the items have to be added from various products and it saves the product info and have to display the details in Table view.But i'm not getting it..

Kindly Guide please..Thanks in advance..

My output is like this first image

But i need to get display as second image which done in Android..


回答1:


Here is something you can try :

Create a function like this one to create all the graphic elements needed :

// Cell appearence editing
- (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier {

    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

    UILabel *tempLabel;
    UIImage *tempImage;

    /* Create UI elements - Customize as you want your text to appear */

    CGRect myFirstLabel = CGRectMake (65, 10, 200, 15);
    CGRect mySecondLabel = CGRectMake (65, 25, 200, 15);
    CGRect myThirdLabel = CGRectMake (65, 40, 200, 15);
    CGRect myImage = CGRectMake (10, 10, 50, 50);

    //Initialize first label
    tempLabel = [[UILabel alloc] initWithFrame: myFirstLabel];
    tempLabel.tag = 1;
    tempLabel.font = [UIFont boldSystemFontOfSize:12];
    tempLabel.textColor = [UIColor lightGrayColor];
    [cell.contentView addSubview: tempLabel];

    //Initialize second label
    tempLabel = [[UILabel alloc] initWithFrame: mySecondLabel];
    tempLabel.tag = 2;
    tempLabel.font = [UIFont boldSystemFontOfSize:12];
    tempLabel.textColor = [UIColor lightGrayColor];
    [cell.contentView addSubview: tempLabel];

    //Initialize third label
    tempLabel = [[UILabel alloc] initWithFrame: mySecondLabel];
    tempLabel.tag = 3;
    tempLabel.font = [UIFont boldSystemFontOfSize:12];
    tempLabel.textColor = [UIColor lightGrayColor];
    [cell.contentView addSubview: tempLabel];

    //Initialize your picture
    imgTemp = [[UIImageView alloc] initWithFrame: myImage];
    imgTemp.tag = 4;
    [cell.contentView addSubview: tempImage];

    return cell;
}

Then, in your cellForRowAtIndexPath, call the "design function" and populate it with your content :

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

    static NSString *CellIdentifier = @"aCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [self getCellContentView: CellIdentifier];
    }

    //This will create the actual UI elements
    UILabel *tempLabel1 = (UILabel *)[cell viewWithTag: 1];
    UILabel *tempLabel2 = (UILabel *)[cell viewWithTag: 2];
    UILabel *tempLabel3 = (UILabel *)[cell viewWithTag: 3];
    UIImageView *tempImage = (UIImageView *)[cell viewWithTag: 4];

    // Populate the labels
    NSString *firstText = [NSString stringWithString: [finarray stringAtIndex: 3*(indexPath.row)]];
    NSString *secondText = [NSString stringWithString: [finarray stringAtIndex: 3*(indexPath.row) + 1]];
    NSString *thirdText = [NSString stringWithString: [finarray stringAtIndex: 3*(indexPath.row) + 2]];

    // Populate the picture
    UIImage *picture = [[UIImage alloc] initWithData:theObjectToPutInCell.picture];

    tempLabel1.text = firstText;
    tempLabel2.text = secondText;
    tempLabel3.text = thirdText;

    tempImage.image = picture;

    return cell;

}

Let me know if it helps !




回答2:


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

    // Return the number of sections.
    return 1;
}

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

    // Return the number of rows in the section.
    return [itemsData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   // static NSString *CellIdentifier = @"Cell";
    NSString *CellIdentifier = [NSString stringWithFormat:@"%d", indexPath.row] ;
    UILabel *lblTitle = nil;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;




        lblTitle =[[UILabel alloc]initWithFrame:CGRectMake(5, 15, 110, 44)];
        lblTitle.backgroundColor = [UIColor clearColor];
        lblTitle.textColor = [UIColor whiteColor];
        lblTitle.font = [UIFont systemFontOfSize:11.0];
        lblTitle.tag = 1;
        lblTitle.numberOfLines = 0;


        UILabel *lblType =[[UILabel alloc]initWithFrame:CGRectMake(125, 0, 75, 44)];
        lblType.backgroundColor = [UIColor clearColor];
        lblType.textColor = [UIColor whiteColor];
        lblType.font = [UIFont systemFontOfSize:11.0];
        lblType.tag = 2;

        UILabel *lblDate =[[UILabel alloc]initWithFrame:CGRectMake(200, 0, 60, 44)];
        lblDate.backgroundColor = [UIColor clearColor];
        lblDate.textColor = [UIColor whiteColor];
        lblDate.font = [UIFont systemFontOfSize:11.0];
        lblDate.tag = 3;

        UILabel *lblTime =[[UILabel alloc]initWithFrame:CGRectMake(265, 0, 50, 44)];
        lblTime.backgroundColor = [UIColor clearColor];
        lblTime.textColor = [UIColor whiteColor];
        lblTime.font = [UIFont systemFontOfSize:11.0];
        lblTime.tag = 4;

        [tableView beginUpdates];
        [tableView endUpdates]; 
        [cell.contentView addSubview:lblTitle];
        [cell.contentView addSubview:lblType];
        [cell.contentView addSubview:lblDate];
        [cell.contentView addSubview:lblTime];

    }

NSString *text = [NSString stringWithFormat:@"%@,%@,%@",[[itemsData objectAtIndex:indexPath.row] objectForKey:@"address"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"title"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"zipcode"]];


    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeCharacterWrap];

    if (!lblTitle)
        lblTitle = (UILabel*)[cell viewWithTag:1];

    [lblTitle setText:text];
    [lblTitle setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];


    UILabel *lblType = (UILabel *) [cell.contentView viewWithTag:2];
    lblType.text =[[itemsData objectAtIndex:indexPath.row] objectForKey:@"type"];

    UILabel *lblDate = (UILabel *) [cell.contentView viewWithTag:3];
    lblDate.text =[[itemsData objectAtIndex:indexPath.row] objectForKey:@"date"];

    UILabel *lblTime = (UILabel *) [cell.contentView viewWithTag:4];
    lblTime.text =[[itemsData objectAtIndex:indexPath.row] objectForKey:@"time"];

    return cell;
}



回答3:


Finally i got it by following code

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

static NSString *CellIdentifier = @"aCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
UILabel *label1=[[UILabel alloc]init];
label1.frame=.....;
................
[cell.contentView addSubView: label1];

UILabel *label2=[[UILabel alloc]init];
label2.frame=.....;
................
[cell.contentView addSubView: label2];

UILabel *label3=[[UILabel alloc]init];
label3.frame=.....;
................
[cell.contentView addSubView: label3];
}

The text to the labels are assigned from individual Array element like this

NSMutableArray *label1Array=[NSMutableArray arrayWithObjects:@"",@"",nil];
NSMutableArray *label2Array=[NSMutableArray arrayWithObjects:@"",@"",nil];
NSMutableArray *label3Array=[NSMutableArray arrayWithObjects:@"",@"",nil];


来源:https://stackoverflow.com/questions/11669766/uilabel-in-uitableviewcell-to-make-a-customised-cell-without-making-separate-cla

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!