Creating a UITableView Programmatically Creating a UITableView Programmatically xcode xcode

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