以编程方式创buildUITableView
我有一个应用程序在Xcode 4.6使用故事板。 我添加了一个UITableView到视图控制器类,按预期工作。 但是,当我尝试删除故事板中的UITableView并以编程方式将其重新添加到同一个类中时,我遇到了两个特定的问题:
1)虽然我将UITableViewCelltypes设置为字幕types,但细节标签不再显示。
2)当我select一个单元格时,不会发生这种情况,并且准备好的segue甚至没有被调用,表示当一个单元格被选中时没有消息被发送到表格视图。
这是相关的代码:
@interface StatsTableViewController () <UITableViewDataSource, UITableViewDelegate> @property (strong, nonatomic) UITableView *tableView; @end @implementation StatsTableViewController -(UITableView *)makeTableView { CGFloat x = 0; CGFloat y = 50; CGFloat width = self.view.frame.size.width; CGFloat height = self.view.frame.size.height - 50; CGRect tableFrame = CGRectMake(x, y, width, height); UITableView *tableView = [[UITableView alloc]initWithFrame:tableFrame style:UITableViewStylePlain]; tableView.rowHeight = 45; tableView.sectionFooterHeight = 22; tableView.sectionHeaderHeight = 22; tableView.scrollEnabled = YES; tableView.showsVerticalScrollIndicator = YES; tableView.userInteractionEnabled = YES; tableView.bounces = YES; tableView.delegate = self; tableView.dataSource = self; return tableView; } - (void)viewDidLoad { [super viewDidLoad]; self.tableView = [self makeTableView]; [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"newFriendCell"]; [self.view addSubview:self.tableView]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"newFriendCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } Friend *friend = [self.fetchedResultsController objectAtIndexPath:indexPath]; **//THIS DATA APPEARS** cell.textLabel.text = friend.name; cell.textLabel.font = [cell.textLabel.font fontWithSize:20]; cell.imageView.image = [UIImage imageNamed:@"icon57x57"]; **//THIS DATA DOES NOT APPEAR** cell.detailTextLabel.text = [NSString stringWithFormat:@"%i Games", friend.gameCount]; cell.detailTextLabel.textColor = [UIColor lightGrayColor]; return cell; } -(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"detailsView" sender:self]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { //I set the segue identifier in the interface builder if ([segue.identifier isEqualToString:@"detailsView"]) { NSLog(@"segue"); //check to see if method is called, it is NOT called upon cell touch NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; ///more code to prepare next view controller.... } }
我不知道我忘了这样做,我可以解决这两个问题。 任何帮助表示赞赏。
当你注册一个类,并使用dequeueReusableCellWithIdentifier:forIndexPath :, dequeue方法保证返回一个单元格,所以你的if(cell == nil)子句永远不会被input。 所以,只要按照旧的方式做,不要注册类,并使用dequeueReusableCellWithIdentifier:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"newFriendCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } //etc. return cell; }
至于segue,它不能被调用,因为你不能在代码中创build一个表,而不是在IB中创build。 再次回到旧的方式,并使用tableView:didSelectRowAtIndexPath:当您select一个单元格时将被调用。 在那里实例化你的细节控制器,并在代码中执行trasition。
编辑后:
我没有看到你的代码。 你已经实现了didDeselectRowAtIndexPath而不是didSelectRowAtIndexPath。 如果你改变了,你的继续应该工作。
你可能会做它的作品100%。
- (void)viewDidLoad { [super viewDidLoad]; // init table view tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; // must set delegate & dataSource, otherwise the the table will be empty and not responsive tableView.delegate = self; tableView.dataSource = self; tableView.backgroundColor = [UIColor cyanColor]; // add to canvas [self.view addSubview:tableView]; } #pragma mark - UITableViewDataSource // number of section(s), now I assume there is only 1 section - (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView { return 1; } // number of row in the section, I assume there is only 1 row - (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section { return 1; } // the cell will be returned to the tableView - (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"HistoryCell"; // Similar to UITableViewCell, but JSCustomCell *cell = (JSCustomCell *)[theTableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[JSCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } // Just want to test, so I hardcode the data cell.descriptionLabel.text = @"Testing"; return cell; } #pragma mark - UITableViewDelegate // when user tap the row, what action you want to perform - (void)tableView:(UITableView *)theTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"selected %d row", indexPath.row); } @end
- (void)viewDidLoad { [super viewDidLoad]; arr=[[NSArray alloc]initWithObjects:@"ABC",@"XYZ", nil]; tableview = [[UITableView alloc]initWithFrame:tableFrame style:UITableViewStylePlain]; tableview.delegate = self; tableview.dataSource = self; [self.view addSubview:tableview]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return arr.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"]; if(cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyCell"]; } cell.textLabel.text=[arr objectAtIndex:indexPath.row]; return cell; }
- (void)viewDidLoad { [super viewDidLoad]; tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; tableView.delegate = self; tableView.dataSource = self; tableView.backgroundColor = [UIColor grayColor]; // add to superview [self.view addSubview:tableView]; } #pragma mark - UITableViewDataSource - (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView { return 1; } - (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection: (NSInteger)section { return 1; } // the cell will be returned to the tableView - (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"HistoryCell"; // Similar to UITableViewCell, but UITableViewCell *cell = (UITableViewCell *)[theTableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.descriptionLabel.text = @"Testing"; return cell; }
使用tableViewController创build一个tableview。
导入UIKit
类TableViewController:UITableViewController {
let tableViewModel = TableViewModel() var product: [String] = [] var price: [String] = [] override func viewDidLoad() { super.viewDidLoad() self.tableView.contentInset = UIEdgeInsetsMake( 20, 20 , 0, 0) let priceProductDetails = tableViewModel.dataProvider() for (key, value) in priceProductDetails{ product.append(key) price.append(value) } } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return product.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = UITableViewCell(style: .Value1, reuseIdentifier: "UITableViewCell") cell.textLabel?.text = product[indexPath.row] cell.detailTextLabel?.text = price[indexPath.row] return cell } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { print("You tapped cell number \(indexPath.row).") }
}
样品表
#import "StartreserveViewController.h" #import "CollectionViewController.h" #import "TableViewCell1.h" @interface StartreserveViewController () { NSArray *name; NSArray *images; NSInteger selectindex; } @end @implementation StartreserveViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor blueColor]; _startReservetable.backgroundColor = [UIColor blueColor]; name = [[NSArray alloc]initWithObjects:@"Mobiles",@"Costumes",@"Shoes", nil]; images = [[NSArray alloc]initWithObjects:@"mobilestitle.jpg",@"costumetitle.jpeg", @"shoestitle.png",nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. }
编译标记 – UiTableview数据源
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section { return 3; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellId = @"tableview"; TableViewCell1 *cell =[tableView dequeueReusableCellWithIdentifier:cellId]; cell.cellTxt .text = [name objectAtIndex:indexPath.row]; cell.cellImg.image = [UIImage imageNamed:[images objectAtIndex:indexPath.row]]; return cell; } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { selectindex = indexPath.row; [self performSegueWithIdentifier:@"second" sender:self]; } #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"second"]) { CollectionViewController *obj = segue.destinationViewController; obj.receivename = [name objectAtIndex:selectindex]; } // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } @end
。H
#import <UIKit/UIKit.h> @interface StartreserveViewController : UIViewController<UITableViewDelegate,UITableViewDataSource> @property (strong, nonatomic) IBOutlet UITableView *startReservetable; @end
vc.m
#import "ViewController.h"
导入“secondViewController.h”
@interface ViewController () { NSArray *cityArray; NSArray *citySubTitleArray; NSArray *cityImage; NSInteger selectindexpath; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. cityArray = [[NSArray alloc]initWithObjects:@"Coimbatore",@"Salem",@"Chennai",nil]; citySubTitleArray = [[NSArray alloc]initWithObjects:@"1",@"2",@"3", nil]; cityImage = [[NSArray alloc]initWithObjects:@"12-300x272.png" , @"380267_70d232fc33b44d4ebe7b42bbe63ee9be.png",@"apple-logo_318 -40184.png", nil]; } #pragma mark - UITableView Data Source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection :(NSInteger)section { return cityImage.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellId = @"city"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellId]; } cell.textLabel.text = [cityArray objectAtIndex:indexPath.row]; cell.detailTextLabel.text = [citySubTitleArray objectAtIndex:indexPath.row]; cell.imageView.image = [UIImage imageNamed: [cityImage objectAtIndex:indexPath.row]]; // NSData *data = [[NSData alloc]initWithContentsOfURL: [NSURL URLWithString:@""]]; // cell.imageView.image = [UIImage imageWithData:data]; return cell; } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath : (NSIndexPath *)indexPath { NSLog(@"---- %@",[cityArray objectAtIndex:indexPath.row]); NSLog(@"----- %@",[cityImage objectAtIndex:indexPath.row]); selectindexpath=indexPath.row; [self performSegueWithIdentifier:@"second" sender:self]; } #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little p - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. if ([segue.identifier isEqualToString:@"second"]) { secondViewController *object=segue.destinationViewController; object.cityName=[cityArray objectAtIndex:selectindexpath]; object.cityImage=[cityImage objectAtIndex:selectindexpath]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
vc.m
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITableViewDataSource , UITableViewDelegate> @property (strong, nonatomic) IBOutlet UITableView *cityLabelList; @end
sv.m
#import <UIKit/UIKit.h> @interface secondViewController : UIViewController @property(strong, nonatomic) NSString *cityName; @property(strong,nonatomic)NSString *cityImage; @end
sv.h
#import "secondViewController.h" @interface secondViewController () @property (strong, nonatomic) IBOutlet UILabel *lbl_desc; @property (strong, nonatomic) IBOutlet UIImageView *img_city; @end @implementation secondViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.title=self.cityName; if ([self.cityName isEqualToString:@"Coimbatore"]) { self.lbl_desc.text=@"Coimbatore city"; self.img_city.image=[UIImage imageNamed: [NSString stringWithFormat:@"%@",self.cityImage]]; } else if ([self.cityName isEqualToString:@"Chennai"]) { self.lbl_desc.text= @"Chennai City Gangstar"; self.img_city.image=[UIImage imageNamed: [NSString stringWithFormat:@"%@",self.cityImage]]; } else { self.lbl_desc.text= @"selam City"; self.img_city.image=[UIImage imageNamed: [NSString stringWithFormat:@"%@",self.cityImage]]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. }
- (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section { return 1; } - (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"HistoryCell"; UITableViewCell *cell = (UITableViewCell *)[theTableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.descriptionLabel.text = @"Testing"; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //Code for selection. }
这些是UITableView委托方法。
#import "ViewController.h" @interface ViewController () { NSMutableArray *name; } @end - (void)viewDidLoad { [super viewDidLoad]; name=[[NSMutableArray alloc]init]; [name addObject:@"ronak"]; [name addObject:@"vibha"]; [name addObject:@"shivani"]; [name addObject:@"nidhi"]; [name addObject:@"firdosh"]; [name addObject:@"himani"]; _tableview_outlet.delegate = self; _tableview_outlet.dataSource = self; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [name count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *simpleTableIdentifier = @"cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; } cell.textLabel.text = [name objectAtIndex:indexPath.row]; return cell; }