Creating a UITableView Programmatically
When you register a class, and use dequeueReusableCellWithIdentifier:forIndexPath:, the dequeue method is guaranteed to return a cell, so your if (cell == nil) clause is never entered. So, just do it the old way, don't register the class, and use 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;}
As for the segue, it can't be called because you can't make a segue to a table that you've created in code, not in IB. Again, go back to the old way and use tableView:didSelectRowAtIndexPath: which will be called when you select a cell. Instantiate your detail controller there and do the trasition in code.
After edit:
I didn't see your added code there. You've implemented didDeselectRowAtIndexPath rather than didSelectRowAtIndexPath. If you change that, your segue should work.
You might be do that its works 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;}