2013-07-01 38 views
30

Nghe chỉ là ý tưởng những gì tôi đang suy nghĩ để thực hiện điều này,Có thể thêm UITableView trong một UITableViewCell

Tôi muốn thực hiện cuốn sách như trang, cho điều này tôi muốn đi UITableView và xoay-90 độ và tế bào của nó bằng 90 độ, và bây giờ tôi muốn phân lớp UITableViewCell, bây giờ bên trong ô xem bảng này có thể thêm UITableview để người dùng có thể cuộn theo chiều dọc để xem nội dung và người dùng cũng có thể cuộn theo chiều ngang để đi tới ô kế tiếp của tableview đã xoay. Nó chỉ là tôi đang suy nghĩ, có cách nào tốt hơn để thực hiện điều này.

+0

Làm thế nào bạn sẽ hỗ trợ sắp xếp lại trên quan điểm bảng khác nhau? –

Trả lời

56

có nó là có thể, tôi đã thêm UITableView trong tế bào UITableView .. :)

không cần phải thêm tế bào tableview trong file xib - chỉ phân lớp các UITableViewCell và sử dụng mã dưới đây, một ô sẽ được tạo theo chương trình.

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


phiên bản Swift Tạo một single view project thêm tableview bên storyboard và cài đặt mã datasourcedelegate

Paste nó dưới đây để 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 
    } 
} 

tạo ra một tập tin mới CustomCell.swift đó là lớp con của UITableViewCelldo not select with xib tập tin này là không có .xib tập tin table và nó cell sẽ được tạo programatically như trong objective-c code.

Dán mã dưới đây để 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! 
    } 
} 
+0

Hey Shan cách ủy quyền xem bảng bên trong ô cho bảng phân cảnh? – EridB

+1

Có phải CustomCell cần triển khai 'UITableViewDataSource' để cho' cellForRowAtIndexPath' của nó được gọi không? –

+3

@MichaelOsofsky, có cho tableview bên trong các tế bào cha mẹ cần phải xác nhận của đại biểu và nguồn dữ liệu, trong mã trên tôi đang làm nó programatically bởi 'subMenuTableView.delegate = self' và ' subMenuTableView.dataSource = self' –

8

Cách tốt hơn: sử dụng UIPageViewController để cuộn trang trái/phải của bạn. Mỗi trang có thể chứa chế độ xem bảng.

+0

Ya cảm ơn ý tưởng .. :) -rob mayoff –

6

Mặc dù ý tưởng của rob tốt hơn nhưng có thể thực hiện được. Kiểm tra cách thực hiện:

Lấy 2 chế độ xem bảng, cung cấp cho họ thẻ 1, 2, hãy gọi các kTagBaseTableView này, kTagInnerTableView. Bây giờ bên dưới là bản in màu xanh lam, cách deat với hai chế độ xem bảng, với đại biểu và nguồn dữ liệu được gắn với bộ điều khiển xem đơn.

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

Ya cảm ơn lời giải thích chi tiết. -rptwsthi –

+0

Nếu nội dung của bảng bên trong phụ thuộc vào bảng bên ngoài, làm thế nào để bạn biết hàng nào trong bảng bên ngoài được chọn khi bạn xử lý các câu lệnh case cho kTagInnerTableView? –

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

Tôi đã thử một cách đơn giản hy vọng bạn thích nó. –

+1

cảm ơn tuyệt vời vì câu trả lời của bạn .. :) anand –

Các vấn đề liên quan