2013-07-01 6 views
30

聞くが、私はこれを実装するために考えていますどのような単なるアイデアです内のUITableViewを追加することが可能には、私がページのような本を実装したい、UITableViewCellの

されており、このために私はのUITableViewを撮りたいと回転-90度とそのセルを90度回転させ、今ではUITableViewCellをサブクラス化したいと考えています。このテーブルビューセル内でUITableviewを追加して、ユーザーが垂直方向にスクロールしてコンテンツを見ることができます。 これは私が考えていることです、これを実装するためのよりよい方法がありますか?

+0

CustomCell.swiftに以下

貼り付けコード? –

答えて

56

は、はい、それは可能ですが、私はのUITableView細胞 内のUITableViewを添加していない.. :)

XIBファイル内のテーブルビューのセルを追加する必要 - ちょうどの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 


スウィフトバージョン single view projectstoryboardtableviewを追加し、ViewController.swift

に以下の datasourcedelegate

貼り付けコードを設定作成

210は.xibファイルtableなしUITableViewCelldo not select with xibこのファイルがあるのサブクラスである新しいファイルCustomCell.swiftを作成し、そのcellobjective-c codeのようにプログラム的に作成されます。どのように別のテーブルビュー間で並べ替えサポートする

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! 
    } 
} 
+0

ストーリーボードのセル内にテーブルビューを委譲するにはどうすればいいですか? – EridB

+1

CustomCellは 'cellForRowAtIndexPath'を呼び出すために' UITableViewDataSource'を実装する必要がありますか? –

+3

@MichaelOsofsky、上記のコードで私はそれをプログラム的に 'subMenuTableView.delegate = self'と ' subMenuTableViewで実行しています。親セル内のtableviewはyesです。委任とデータソースを確認する必要があります。dataSource = self' –

8

より良い方法:左右のページのスクロールにUIPageViewControllerを使用してください。各ページには表ビューを含めることができます。

+0

ああ、ありがとうございました。:) -rob mayoff –

6

robのアイデアは優れていますが、可能です。方法を確認してください:

2つのテーブルビューを取得し、タグ1,2を与えて、これらのkTagBaseTableView、kTagInnerTableViewを呼び出してみましょう。ここでは、青色のプリント、デリゲートとデータソースを1つのView Controllerに接続して、2つのテーブルビューを使用して通知する方法を示します。

- (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]; 
} 
+0

詳細な説明に感謝します。 -rptwsthi –

+0

内部テーブルの内容が外部テーブルに依存する場合、kTagInnerTableViewのcase文を処理するときに、外部テーブルのどの行が選択されているかをどのように知ることができますか? –

0
#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

私は簡単な方法で試してみました。 –

+1

あなたの答えに大きな感謝.. :)と –

関連する問題