是否可以在UITableViewCell中添加UITableView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以在UITableViewCell中添加UITableView相关的知识,希望对你有一定的参考价值。

听到的只是我想要实现的想法,

我想实现像页面一样的书,为此我想采取UITableView并旋转90度及其单元格90度,现在我想继承UITableViewCell,现在在这个tableview单元格中,可以添加UITableview以便用户可以垂直滚动以查看内容,用户也可以水平滚动以转到旋转的tableview的下一个单元格。我只是在想,有没有更好的方法来实现它。

答案

是的,有可能,我在UITableView单元格中添加了UITableVIew .. :)

无需在xib文件中添加tableview单元 - 只需将UITableviewCell子类化并使用下面的代码,将以编程方式创建单元格。

//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版本在single view project中创建一个tableview添加storyboard并设置其datasourcedelegate

将代码粘贴到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
   }
}

创建一个新文件CustomCell.swift这是UITableViewCelldo not select with xib的子类,这个文件没有.xib文件table,它的cell将以编程方式创建,如objective-c code

将代码粘贴到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!
  }
}
另一答案

更好的方法:使用UIPageViewController进行左/右页面滚动。每个页面都可以包含一个表视图。

另一答案

虽然抢劫的想法更好但是有可能。检查方式:

拿2个表视图,给它们标记1,2,让我们调用这些kTagBaseTableView,kTagInnerTableView。现在下面是蓝图,如何使用两个表视图进行deat,将委托和数据源附加到单个视图控制器。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{              // Default is 1 if not implemented
    switch (tableView.tag) {
        case kTagBaseTableView:
            return baseSectionCount;
            break;
        case kTagInnerTableView:
            return innerSectionCount;
            break;
        default:
            break;
    }
    return 0;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    switch (tableView.tag) {
        case kTagBaseTableView:
            return [baseDataSource count];
            break;
        case kTagInnerTableView:
            return [innerDataSource count];
            break;
        default:
            break;
    }
    return 0;
}

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available

以上是关于是否可以在UITableViewCell中添加UITableView的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在UITableViewCell中添加UITableView

iOS - UI 测试在 UITableViewCell 中查找图像

在 UITableViewCell 内部的 UIView 上添加 SwiftUI [重复]

ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

contentView 在 iOS 6 UITableViewCell 原型单元格中没有缩进

是否不可能将子视图添加到我的 UITableViewCell 的 contentView 并使其宽度与 contentView 相等?