Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to add UITableView within a UITableViewCell

Hear is just the idea what i am thinking to implement this,

I want to implement book like pages, for this i want to take UITableView and rotated-90 degree and its cell by 90 degree, and now i want to subclass UITableViewCell, now within this tableview cell it is possible to add UITableview so that user can scroll vertically to see the contents and user can also scroll horizontally to go to next cell of rotated tableview. It is just i am thinking, is there any better way to implement this.

like image 802
Shankar BS Avatar asked Jul 01 '13 05:07

Shankar BS


People also ask

How do I add a search bar to UITableView?

Adding Search Bar on TableViewAdd the UISearchBar at the top of your UITableView. … and give the name searchBar. In the ViewController add a Boolean called searching to know when to switch between the full list of items and the list of items from the searching results.

How do I populate UITableView?

There are two main base ways to populate a tableview. The more popular is through Interface Building, using a prototype cell UI object. The other is strictly through code when you don't need a prototype cell from Interface Builder.

How can we use a reusable cell in UITableView?

For performance reasons, a table view's data source should generally reuse UITableViewCell objects when it assigns cells to rows in its tableView(_:cellForRowAt:) method. A table view maintains a queue or list of UITableViewCell objects that the data source has marked for reuse.


2 Answers

yes it is possible, I added the UITableVIew within the UITableView cell .. :)

no need to add tableview cell in xib file - just subclass the UITableviewCell and use the code below, a cell will be created programatically.

//in your main TableView   #import "ViewController.h" #import "CustomCell.h" @interface ViewController ()<UITableViewDataSource , UITableViewDelegate>  @end  @implementation ViewController  - (void)viewDidLoad  {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.  }  - (void)didReceiveMemoryWarning   {      [super didReceiveMemoryWarning];      // Dispose of any resources that can be recreated.   }   - (void)dealloc  {  [_aTV release];  [super dealloc]; }   -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  {   return 1;  }  -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  {   return 3;  }   -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    CustomCell *cell = [self.aTV dequeueReusableCellWithIdentifier:@"Cell"];    if(cell == nil)    {      cell = [[[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]autorelease];    }    cell.dataAraay = [NSMutableArray arrayWithObjects:@"subMenu->1",@"subMenu->2",@"subMenu->3",@"subMenu->4",@"subMenu->5", nil]; return  cell; }   -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {    return 150; }   //in your custom tableview cell  //  .m file #import "CustomCell.h"  @implementation CustomCell  @synthesize dataAraay; //array to hold submenu data  - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier  {     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];     if (self) {     // Initialization code    self.frame = CGRectMake(0, 0, 300, 50);    UITableView *subMenuTableView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStylePlain]; //create tableview a    subMenuTableView.tag = 100;   subMenuTableView.delegate = self;   subMenuTableView.dataSource = self;   [self addSubview:subMenuTableView]; // add it cell   [subMenuTableView release]; // for without ARC   } return self; }  - (void)setSelected:(BOOL)selected animated:(BOOL)animated  {      [super setSelected:selected animated:animated];    // Configure the view for the selected state  }   -(void)layoutSubviews  {    [super layoutSubviews];    UITableView *subMenuTableView =(UITableView *) [self viewWithTag:100];    subMenuTableView.frame = CGRectMake(0.2, 0.3, self.bounds.size.width-5,    self.bounds.size.height-5);//set the frames for tableview  }    //manage datasource and  delegate for submenu tableview  -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView   {      return 1;   }  -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  {    return dataAraay.count;  }  -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellID"];     if(cell == nil)     {        cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellID"]autorelease];    }   cell.textLabel.text = [self.dataAraay objectAtIndex:indexPath.row];    return cell;  }  @end 


Swift version Create a single view project add tableview inside storyboard and set up its datasource and delegate

Paste code below to ViewController.swift

  import UIKit    class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {    override func viewDidLoad() {       super.viewDidLoad()       // Do any additional setup after loading the view, typically from a nib.   }    override func didReceiveMemoryWarning() {       super.didReceiveMemoryWarning()       // Dispose of any resources that can be recreated.   }    func numberOfSectionsInTableView(tableView: UITableView) -> Int {       return 3;   }    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {       return 1;   }    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {       var cell:CustomCell? = tableView.dequeueReusableCellWithIdentifier("Cell") as?  CustomCell       if cell == nil {          cell = CustomCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")       }       cell?.dataArr = ["subMenu->1","subMenu->2","subMenu->3","subMenu->4","subMenu->5"]       return cell!     }     func  tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {        return 150.0    } } 

create a new file CustomCell.swift which is the subclass of UITableViewCell and do not select with xib this file is without .xib file table and its cell will be created programatically as in objective-c code.

Paste code below to CustomCell.swift

  import UIKit    class CustomCell: UITableViewCell,UITableViewDataSource,UITableViewDelegate {    var dataArr:[String] = []   var subMenuTable:UITableView?   override init(style: UITableViewCellStyle, reuseIdentifier: String?) {       super.init(style: style , reuseIdentifier: reuseIdentifier)       setUpTable()   }    required init(coder aDecoder: NSCoder) {       fatalError("init(coder:) has not been implemented")       setUpTable()   }    override func awakeFromNib() {       super.awakeFromNib()       // Initialization code       setUpTable()   }    func setUpTable(){       subMenuTable = UITableView(frame: CGRectZero, style:UITableViewStyle.Plain)       subMenuTable?.delegate = self       subMenuTable?.dataSource = self       self.addSubview(subMenuTable!)   }    override func layoutSubviews() {       super.layoutSubviews()       subMenuTable?.frame = CGRectMake(0.2, 0.3, self.bounds.size.width-5, self.bounds.size.height-5)   }    override func setSelected(selected: Bool, animated: Bool) {       super.setSelected(selected, animated: animated)       // Configure the view for the selected state   }    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {       return dataArr.count   }    func numberOfSectionsInTableView(tableView: UITableView) -> Int {       return 1   }    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {      var cell: UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("cellID")      if cell == nil {         cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cellID")     }      cell?.textLabel?.text = dataArr[indexPath.row]      return cell!   } } 
like image 120
Shankar BS Avatar answered Sep 20 '22 03:09

Shankar BS


Better way: use a UIPageViewController for your left/right page scrolling. Each page can contain a table view.

like image 39
rob mayoff Avatar answered Sep 21 '22 03:09

rob mayoff