Multiple UITableview in Single Viewcontroller

34,074

Solution 1

It will be the same as you do it with one table view, but you should check which tableview is currently using.

myTableView1.dataSource = self;
...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  if (tableView == myTableView1) {
    // your code 1
  }
  else 
  if (tableView == myTableView2) {
      // your code 2
  }
  else 
  if (tableView == myTableView3) {
      // your code 3
  }
}

Edit:

About brightness:

How to change brightness in iOS 5 app?

And about UISlider it has minimunValue and maximumValue properties.

- (void) sliderChanged:(UISlider*)sender{
    UISlider *slider = (UISlider*)sender;
    [[UIScreen mainScreen] setBrightness:slider.value];
}

Edit:

slider.tag = 1;
[cell addSubview:slider];


...
// when you need..
indexPath = [NSIndexPath indexPathForRow:myRow inSection:mySecion];
UISlider* slider = (UISlider*) [[self.tableView cellForRowAtIndexPath:indexPath] viewWithTag:1];

Solution 2

You always get a reference and can always check for which tableView delegate or dataSource method is called.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    if (tableView == self.tableView1)
    {
        return 1;
    }

    if (tableView == self.tableView2)
    {
        return 1;
    }

    if (tableView == self.tableView3)
    {
        return 1;
    }
}

You don't gain anything by using same identifier for all tables. Use something like:

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{    
    if (tableView == self.tableView1)
    {
        static NSString *CellIdentifier1 = @"cellForTable1";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];

        if (!cell)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier1];
        }

        cell.textLabel.text = [NSString stringWithFormat: @"table1: %d.%d", indexPath.section, indexPath.row];

        return cell;
    }

    if (tableView == self.tableView2)
    {
        static NSString *CellIdentifier2 = @"cellForTable2";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];

        if (!cell)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier2];
        }

        cell.textLabel.text = [NSString stringWithFormat: @"table2: %d.%d", indexPath.section, indexPath.row];

        return cell;
    }

   if (tableView == self.tableView1)
    {
        static NSString *CellIdentifier3 = @"cellForTable3";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier3];

        if (!cell)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier3];
        }

        cell.textLabel.text = [NSString stringWithFormat: @"table3: %d.%d", indexPath.section, indexPath.row];

        return cell;
    }   
}

Solution 3

//add tag in tableView .
myTable1.tag = 200;
myTable2.tag = 201;
myTable3.tag = 202;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
if (tableView.tag == 200)
{
    return 1;
}
if (tableView.tag == 201)
{
    return 1;
}
if (tableView.tag == 202)
{
    return 1;
}


}

Solution 4

You can manage multiple tableView in a single ViewController by writing below code inside UItableViewDelegate and UItableViewDatasource.

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if tableView  == tableView1
    {
        // place your code here
    }
    else if tableView  == tableView2 {
        // place your code here
    }
    else {
      return 0
    }
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if tableView  == tableView1
    {
        // place your code here
    }
    else if tableView  == tableView2 {
        // place your code here
    } 
    else {
        return 0
    }
}
// You can set a different size of your tableView using below lines of code 
if tableView  == tableView1{
    return 50
}
else{
    return 40
}

Solution 5

None of the previous worked for me, I come up with the following solution:

  public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  if((tableView1 != nil) && (tableView  == tableView1)) {
   return Items1.count
  }
  else if((tableView2 != nil) && (tableView  == tableView2)) {
   return Items2.count
  }
  else if((tableView3 != nil) && (tableView  == tableView3)) {
   return Items3.count
  }
  else {
   return 0
  }
}
Share:
34,074
Naveen
Author by

Naveen

Updated on October 03, 2020

Comments

  • Naveen
    Naveen over 3 years

    I have a viewcontroller in that i want to show 3 tableviews(because the content and the table properties are different). How do i add these delegate methodes for 3 tables in one viewcontroller?

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return [array1 count];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {}
    

    EDIT

    So what will i do if i want add a uislider to one table row using custom cell and when i slide the value i want to change the display brightness?

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        if (tableView == _displayThemes) {
            return 1;
        } else {
            return 1; 
        }
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        if(tableView==_displayThemes) {
            return 1;
        } else {
            return 5;
        }
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
    
        if (tableView == _displayThemes) {
            cell.textLabel.text = [displaytheme objectAtIndex:indexPath.row];
            return cell;
        } else {
            cell.textLabel.text = [fontlist objectAtIndex:indexPath.row];
            return cell;
        }
    }
    
    
    - (IBAction)fontButton:(id)sender {
        _fontList = [[UITableView alloc]init];
        [self.view addSubview:_fontList];
        [UIView animateWithDuration:1.5
                delay:0
                options: UIViewAnimationOptionTransitionCurlUp
                animations:^{
                    _fontList.fram e= CGRectMake(0,800,320,200);
                }
                completion:^(BOOL finished){
                    _fontList.frame = CGRectMake(0,280,320,200);     
        }];
    
        [_fontList reloadData];
    }
    
    - (IBAction)button:(id)sender {
        _displayThemes = [[UITableView alloc]init];
        [self.view addSubview:_displayThemes];
        [UIView animateWithDuration:1.5
                delay:0
                options: UIViewAnimationOptionTransitionCurlUp
                animations:^{
                    _displayThemes.frame=CGRectMake(0,800,320,200);
                }
                completion:^(BOOL finished){
                    _displayThemes.frame=CGRectMake(0,280,320,200);
        }];
    }
    
  • Naveen
    Naveen about 11 years
    can i add static NSString *CellIdentifier=@"Cell"; common for all?
  • Naveen
    Naveen about 11 years
    can i add static NSString *CellIdentifier=@"Cell"; common for all?
  • B.S.
    B.S. about 11 years
    I think that yes, but i remember that NSString *CellIdentifier = [NSString stringWithFormat: @"row%dsection%d", indexPath.row, indexPath.section]; worked for me.
  • Rok Jarc
    Rok Jarc about 11 years
    If all the cells in all the tables are of same type then you can. But i'd separate the reusing functionality with distinct cell identifiers.
  • Naveen
    Naveen about 11 years
    My table is not displaying anything now
  • Naveen
    Naveen about 11 years
    i apreciate ur answer but how do i get this value from tableview row?
  • Rok Jarc
    Rok Jarc about 11 years
    Can you post your new code - the one that isn't working. Not all the code, just table delegate and dataSource methods...
  • Rok Jarc
    Rok Jarc about 11 years
    Try modifying your cellForRowAtIndexPath to suit the format in my answer. As for slider in a custom cell you should post another question - it's completely different topic.
  • Krutarth Patel
    Krutarth Patel over 7 years
    @RokJarc what about height.when i use two tableview.height is not working
  • Rok Jarc
    Rok Jarc over 7 years
    @KrutarthPatel: hmm, can't say anything based on your comment alone. did you open a question with a bit of more details? if so you can post a link here and i'll take a look at it
  • Krutarth Patel
    Krutarth Patel over 7 years
    @RokJarc thanks for quick response.stackoverflow.com/questions/40020007/…
  • sɐunıɔןɐqɐp
    sɐunıɔןɐqɐp almost 6 years
    Welcome to Stack Overflow! Please don't just throw your source code here. Be nice and try to give a nice description to your answer, so that others will like it and upvote it. See: How do I write a good answer?