it-swarm.com.de

Ist es möglich, UITableView innerhalb einer UITableViewCell hinzuzufügen

Hören ist nur die Idee, was ich denke, um dies umzusetzen,

Ich möchte Buch-ähnliche Seiten implementieren, dazu möchte ich UITableView nehmen und -90 Grad und seine Zelle um 90 Grad gedreht haben, und jetzt möchte ich UITableViewCell subclassieren. Jetzt können Sie innerhalb dieser Tableview-Zelle UITableview hinzufügen, sodass der Benutzer dies tun kann vertikal scrollen, um den Inhalt anzuzeigen, und Benutzer können auch horizontal scrollen, um zur nächsten Zelle der gedrehten Tabellenansicht zu gelangen. Ich denke nur, gibt es einen besseren Weg, dies umzusetzen?.

36
Shankar BS

ja, es ist möglich, ich habe die UITableVIew in die UITableView-Zelle eingefügt .. :)

sie müssen keine Tableview-Zelle in der xib-Datei hinzufügen. Sie müssen lediglich die UITableviewCell-Klasse subclassieren und den folgenden Code verwenden. Eine Zelle wird programmgesteuert erstellt.

//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 Erstellen Sie einen single view project add tableview in storyboard und richten Sie dessen datasource und delegate ein.

Code unten in ViewController.Swift einfügen

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

erstellen Sie eine neue Datei CustomCell.Swift, die die Unterklasse von UITableViewCell und do not select with xib ist. Diese Datei ist ohne .xib-Datei table und ihre cell wird programmatisch wie in objective-c code erstellt.

Code unten in CustomCell.Swift einfügen

  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

Besser: Verwenden Sie eine UIPageViewController für das Scrollen Ihrer linken/rechten Seite. Jede Seite kann eine Tabellenansicht enthalten.

9
rob mayoff

Rob's Idee ist zwar besser, aber es ist möglich. Überprüfen Sie wie:

Nehmen Sie die 2-Tabellensicht, geben Sie ihnen das Tag 1, 2, nennen wir sie kTagBaseTableView, kTagInnerTableView. Im Folgenden finden Sie die Blaupause, wie Sie mit der Zwei-Tabellen-Ansicht arbeiten, wobei Delegat und Datenquelle an den Single-View-Controller angeschlossen sind.

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

Erstellen Sie eine Unterklasse für tableView und überschreiben Sie die intrinsicContentSize. Ich habe hier geantwortet.

0
Learner