web-dev-qa-db-fra.com

Est-il possible d'ajouter UITableView dans un UITableViewCell

Entendre, c’est juste l’idée de ce que je pense pour le mettre en oeuvre,

Je veux implémenter des livres comme des pages, pour cela, je veux prendre UITableView et rotated-90 degree et sa cellule de 90 degrés, et maintenant je veux sous-classer UITableViewCell. faites défiler verticalement pour voir le contenu. L'utilisateur peut également faire défiler horizontalement pour aller à la cellule suivante de la table vue en rotation. C'est juste que je me demande s'il existe un meilleur moyen de mettre cela en œuvre.

36
Shankar BS

oui c'est possible, j'ai ajouté UITableVIew dans la cellule UITableView .. :)

pas besoin d'ajouter une cellule tableview dans un fichier xib - il suffit de sous-classer UITableviewCell et d'utiliser le code ci-dessous, une cellule sera créée par programme ..__

//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


Version Swift Créer un single view project ajouter tableview dans storyboard et configurer ses datasource et delegate

Collez le code ci-dessous à 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
   }
}

créer un nouveau fichier CustomCell.Swift qui est la sous-classe de UITableViewCell et do not select with xib ce fichier est sans .xib fichier table et sa cell sera créée par programme comme dans objective-c code.

Collez le code ci-dessous à 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!
  }
}
65
Shankar BS

Meilleure façon: utilisez une UIPageViewController pour votre défilement page gauche/droite. Chaque page peut contenir une vue sous forme de tableau.

9
rob mayoff

Bien que l'idée de rob soit meilleure mais oui, c'est possible. Vérifiez comment:

Prenez 2 tables, donnez-leur les balises 1 et 2, appelons ces kTagBaseTableView, kTagInnerTableView. Ci-dessous, l’imprimé bleu, comment créer une vue sous forme de tableau avec délégué et source de données attachés au contrôleur de vue unique.

- (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 reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = nil;
    switch (tableView.tag) {
        case kTagBaseTableView:{
            static NSString* baseIdentifier = @"baseTableViewCell";
            cell = [tableView dequeueReusableCellWithIdentifier:genderIdentifier];
            if (cell == nil) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:genderIdentifier];
                [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
            }
            cell.textLabel.text = NSLocalizedString(titleKey, nil);
            return cell;

        }
            break;
        case kTagInnerTableView:{
            static NSString* innerIdentifier = @"innerTableViewCell";
            cell = [tableView dequeueReusableCellWithIdentifier:genderIdentifier];
            if (cell == nil) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:genderIdentifier];
                [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
            }
            cell.textLabel.text = NSLocalizedString(titleKey, nil);
            return cell;
        }
        default:
            break;
    }
    return cell;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{    // fixed font style. use custom view (UILabel) if you want something different
    switch (tableView.tag) {
        case kTagBaseTableView:
            break;
        case kTagInnerTableView:
            break;
        default:
            break;
    }
    return nil;
}

//TABLE VIEW DELEGATE
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    selectedIndexPath = indexPath;
    switch (tableView.tag) {
      case kTagBaseTableView:{}
          break;
      case kTagInnerTableView:{
      }
          break;
      default:
          break;
   }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}
6
rptwsthi
#import "API.h"
#import "Parsing.pch"
#import "HomeViewController.h"
#import "ASIFormDataRequest.h"
#import "MBProgressHUD.h"
#import "UIImageView+WebCache.h"
#import "HomeCollectionViewCellForSubCat.h"
#import "CollectionViewTableViewCell.h"
#import "NewsTableViewCell.h"
#import "CategoryTableViewCell.h"
#import "HomeCollectionViewCellForSubCat.h"
#import "WebviewController.h"
#import "TopFreeAppsCollectionViewTableViewCell.h"
#import "TopSitesCollectionViewTableViewCell.h"
#import "TrandingVideoCollectionViewTableViewCell.h"
#import "SportsTableViewCell.h"
#import "JokesTableViewCell.h"
@interface HomeViewController ()
{
    MBProgressHUD *hud;
    NSMutableArray *Details;
    NSIndexPath *IndexPath;
    CollectionVIewTableViewCell *TrafficCell;
    NewsTableViewCell *NewsCell;
    CategoryTableViewCell *CategoryCell;
    TopFreeAppsCollectionViewTableViewCell *TopAppsCell;
    TopSitesCollectionViewTableViewCell *TopSitesCell;
    TrandingVideoCollectionViewTableViewCell *TrendingVideosCell;
    SportsTableViewCell *SportsCell;
    JokesTableViewCell *JokesCell;
}
@end
NSString *More;
NSMutableArray *news;

@implementation HomeViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.tableView.dataSource = self;
    self.tableView.delegate = self;

    self.automaticallyAdjustsScrollViewInsets = NO;
    //[self.navigationController setNavigationBarHidden:YES];


}

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

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    return dataArray.count;
}

- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([[dataArray[indexPath.row] valueForKey:@"type"] isEqual:@"Traffic" ])
    {
        if(!TrafficCell)
        {
            TrafficCell = [tableView dequeueReusableCellWithIdentifier:@"CollectionVIewTableViewCell" forIndexPath:indexPath];
            NSDictionary *dict=dataArray[indexPath.row];
            TrafficCell.Traffic = [dict valueForKey:@"detail"];
            [TrafficCell.collectionView reloadData];
            return TrafficCell;
        }
        return TrafficCell;
    }
    else if([[dataArray[indexPath.row] valueForKey:@"type"] isEqual:@"News"])
    {
        if(!NewsCell)
        {
            NewsTableViewCell *cell = (NewsTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"NewsTableViewCell" forIndexPath:indexPath];
            NSDictionary *dict=dataArray[indexPath.row];
            cell.News = [dict valueForKey:@"detail"];
            [cell.NewsTableView reloadData];
            return cell;
        }
        return NewsCell;

    }
    else if ([[dataArray[indexPath.row] valueForKey:@"type"] isEqual:@"TopApps"])
    {
        if(!TopAppsCell)
        {
            TopAppsCell = [tableView dequeueReusableCellWithIdentifier:@"TopFreeAppsCollectionViewTableViewCell" forIndexPath:indexPath];
            NSDictionary *dict=dataArray[indexPath.row];
            TopAppsCell.TopApps = [[dict valueForKey:@"detail"]valueForKey:@"small_banner"];
            [TopAppsCell.TopAppsCollectionView reloadData];
            return TopAppsCell;
        }
        return TopAppsCell;
    }

    else if ([[dataArray[indexPath.row] valueForKey:@"type"] isEqual:@"TopSites"])
    {
        if(!TopSitesCell)
        {
            TopSitesCell = [tableView dequeueReusableCellWithIdentifier:@"TopSitesCollectionViewTableViewCell" forIndexPath:indexPath];
            NSDictionary *dict=dataArray[indexPath.row];
            TopSitesCell.TopSites = [dict valueForKey:@"detail"];
            [TopSitesCell.TopSitesCollectionView reloadData];
            return TopSitesCell;
        }
        return TopSitesCell;
    }

    else if ([[dataArray[indexPath.row] valueForKey:@"type"] isEqual:@"Category"])
    {
        if(!CategoryCell)
        {
            CategoryCell= [tableView dequeueReusableCellWithIdentifier:@"CategoryTableViewCell" forIndexPath:indexPath];
            NSDictionary *dict=dataArray[indexPath.row];
            CategoryCell.Category = [dict valueForKey:@"detail"];
            [CategoryCell.CategorycollectionView reloadData];
            return CategoryCell;
        }
        return CategoryCell;
    }

    else if ([[dataArray[indexPath.row] valueForKey:@"type"] isEqual:@"TrendingVideos"])
    {
        if(!TrendingVideosCell)
        {
            TrendingVideosCell= [tableView dequeueReusableCellWithIdentifier:@"TrandingVideoCollectionViewTableViewCell" forIndexPath:indexPath];
            NSDictionary *dict=dataArray[indexPath.row];
            TrendingVideosCell.TrendingVideos = [[dict valueForKey:@"detail"]valueForKey:@"small_banner"];
            [TrendingVideosCell.VideosCollectionView reloadData];
            return TrendingVideosCell;
        }
        return TrendingVideosCell;
    }

    else if ([[dataArray[indexPath.row] valueForKey:@"type"] isEqual:@"Sports"])
    {
        if(!SportsCell)
        {
            SportsCell= [tableView dequeueReusableCellWithIdentifier:@"SportsTableViewCell" forIndexPath:indexPath];
            NSDictionary *dict=dataArray[indexPath.row];
            SportsCell.Sports = [dict valueForKey:@"detail"];
            [SportsCell.SportsTableView reloadData];
            return SportsCell;
        }
        return SportsCell;
    }

    else if ([[dataArray[indexPath.row] valueForKey:@"type"] isEqual:@"Jokes"])
    {
        if(!JokesCell)
        {
            JokesCell= [tableView dequeueReusableCellWithIdentifier:@"JokesTableViewCell" forIndexPath:indexPath];
            NSDictionary *dict=dataArray[indexPath.row];
            JokesCell.Jokes = [dict valueForKey:@"detail"];
            [JokesCell.JokesTableView reloadData];
            return JokesCell;
        }
        return JokesCell;
    }
    else
    {

    }
    return nil;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSDictionary *dict = dataArray[indexPath.row];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath: indexPath];
    if([dict[@"type"] isEqual:@"Traffic" ])
    {
        //Find your collectionView in cell
        //Tap on Traffic cells
    }
    else if([dict[@"type"] isEqual:@"News"])
    {
        //Tap on News cells

    }
    else if([dict[@"type"] isEqual:@"Category"])
    {
        //Tap on Category cells

    }
    else if([dict[@"type"] isEqual:@"TopApps"])
    {
        //Tap on TopApps cells

    }
    else if([dict[@"type"] isEqual:@"TopSites"])
    {
        //Tap on TopSites cells

    }
    else if([dict[@"type"] isEqual:@"TrendingVideos"])
    {
        //Tap on Trending cells

    }
    else if([dict[@"type"] isEqual:@"Sports"])
    {
        //Tap on Sports cells

    }
    else if([dict[@"type"] isEqual:@"Jokes"])
    {
        //Tap on Jokes cells
    }
}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary *dict = dataArray[indexPath.row];
    if([dict[@"type"] isEqual:@"Traffic" ])
    {
        return 155;
    }
    else if([dict[@"type"] isEqual:@"News"])
    {
        return 300;
    }
    else if([dict[@"type"] isEqual:@"Category"])
    {
        return 120;
    }
    else if([dict[@"type"] isEqual:@"TopApps"])
    {
        return 180;
    }
    else if([dict[@"type"] isEqual:@"TopSites"])
    {
        return 240;
    }
    else if([dict[@"type"] isEqual:@"TrendingVideos"])
    {
        return 270;
    }
    else if([dict[@"type"] isEqual:@"Sports"])
    {
        return 310;
    }
    else if ([dict[@"type"] isEqual:@"Jokes"])
    {
        return 280;
    }
    return 200;
}
0
Chandan Anand

Créez une sous-classe pour tableView et remplacez le type intrinsicContentSize. J'ai répondu ici.

0
Learner