CrackerBarrelKid55
CrackerBarrelKid55

Reputation: 608

Multiple Custom Cells

I'm trying to get my custom .XIB Cell called "ProfileCell1" into the first cell of my table view (size 150) and then my second custom .XIB Cell called "ProfileCell2" into the second cell (size 60).

I can get "ProfileCell1" into the first row, but I can't figure out how to put the second one in, since the first will repeat when I increase the return value from 1 on the "numberOfRowsInSection".

Here is my code so far:

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

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

and

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString *identifier = @"ProfileCell1";
     ProfileCell1 *cell = (ProfileCell1 *)[tableView dequeueReusableCellWithIdentifier:identifier];

     if (cell == nil)
     {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProfileCell1" owner:self options:nil];
            cell = [nib objectAtIndex:0];
     }

     cell.profilePictureView.image = [UIImage imageNamed:[thumbnails objectAtIndex:indexPath.row]];
     return cell;
}

and

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
      return 150;
}

So I know this code repeats my ProfileCell1, but I just can't figure out how to make it appear only once, and then start my ProfileCell2 from the second cell, and have both cells return 2 different values in the 'heightForRowAtIndexPath.

I've tried stuff like:

if (indexPath.row == 0) {
    return 150;
else {
    return 60;
}

but it doesn't seem to work. Cheers!

Upvotes: 1

Views: 89

Answers (4)

Dharmesh Dhorajiya
Dharmesh Dhorajiya

Reputation: 3984

try this way

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (section==0) {
    return 1;// your require number of cell
}
else
{
   return 1;
}
}

and

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section==0) {
        static NSString *identifier = @"ProfileCell1";
        ProfileCell1 *cell = (ProfileCell1 *)[tableView dequeueReusableCellWithIdentifier:identifier];

        if (cell == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProfileCell1" owner:self options:nil];
            cell = [nib objectAtIndex:0];
        }

        cell.profilePictureView.image = [UIImage imageNamed:[thumbnails objectAtIndex:indexPath.row]];
        return cell;
    }
    else
    {
        // your second cell coding here
        static NSString *identifier = @"ProfileCell2";
        ProfileCell2 *cell = (ProfileCell1 *)[tableView dequeueReusableCellWithIdentifier:identifier];

        if (cell == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProfileCell2" owner:self options:nil];
            cell = [nib objectAtIndex:0];
        }
        // your second cell code 
        //cell.profilePictureView.image = [UIImage imageNamed:[thumbnails objectAtIndex:indexPath.row]];
        return cell;
    }
    }

and increase height for cell

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section==0) {
        return 150;
    }
    else
    {
         return 60;
    }
}

you can use two different cell in same UITableView using two section. first section use first cell .xib and second section use second .xib files.

Upvotes: 1

nilam_mande
nilam_mande

Reputation: 931

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
  if (indexPath.row == 0) 
    return 150;
  else 
    return 60;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
   if (indexPath.row == 0) 
    {
      static NSString *identifier = @"ProfileCell1";
      ProfileCell1 *cell = (ProfileCell1 *)[tableView dequeueReusableCellWithIdentifier:identifier];
      //bla bla bla code for ProfileCell1 here
    return cell;
   }
   else
   {
      static NSString *identifier = @"ProfileCell2";
      ProfileCell2 *cell = (ProfileCell2 *)[tableView dequeueReusableCellWithIdentifier:identifier];
      //bla bla bla code for ProfileCell2 here
    return cell;
   }

}

Upvotes: 0

Sushil Sharma
Sushil Sharma

Reputation: 2361

You can also use two different cells in single section. Making some edit to Dharmesh Dhorajiya's Post.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row==0) {
        static NSString *identifier = @"ProfileCell1";
        ProfileCell1 *cell = (ProfileCell1 *)[tableView dequeueReusableCellWithIdentifier:identifier];

        if (cell == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProfileCell1" owner:self options:nil];
            cell = [nib objectAtIndex:0];
        }

        cell.profilePictureView.image = [UIImage imageNamed:[thumbnails objectAtIndex:indexPath.row]];
        return cell;
    }
    else
    {
        // your second cell coding here
        static NSString *identifier = @"ProfileCell2";
        ProfileCell2 *cell = (ProfileCell1 *)[tableView dequeueReusableCellWithIdentifier:identifier];

        if (cell == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ProfileCell2" owner:self options:nil];
            cell = [nib objectAtIndex:0];
        }

        cell.profilePictureView.image = [UIImage imageNamed:[thumbnails objectAtIndex:indexPath.row]];
        return cell;
    }
    }

And use same code you are using to return height for two different cells.

if (indexPath.row == 0) {
    return 150;
else {
    return 60;
}

Upvotes: 1

Pepeng Hapon
Pepeng Hapon

Reputation: 367

How about identifying the indexPath where you want to put ProfileCell1 and ProfileCell2

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     // say you want to use ProfileCell1 in first row
     if(indexPath.row == 0) {
         static NSString *identifier = @"ProfileCell1";
         ProfileCell1 *cell = (ProfileCell1 *)[tableView dequeueReusableCellWithIdentifier:identifier];

         // cell properties

         return cell;
     } else {
         static NSString *identifier = @"ProfileCell2";
         ProfileCell2 *cell = (ProfileCell2 *)[tableView dequeueReusableCellWithIdentifier:identifier];

         // cell properties

         return cell;
     } 
}

Upvotes: 0

Related Questions