Rick Rick - 1 month ago 9
Objective-C Question

Table view as an object in a view - how to initialize with an array of data?

My goal is to have something like a "select" option in a HTML form, but now in my app. After doing research it's probably best to do this with a table view. I though of the picker view, but the fixed height is too big.

With the interface builder I simply placed a table view on my subclass of UIViewController.

How do I fill the Table view with options? I've seen many tutorials, but those are all for having a UITableView as their own class and filling up the entire screen. In my application this is just a small piece of the entire form.

What a nightmare to create a relatively simple thing like a table view. It either crashes or I get a table view that covers my entire view and that is not filled with anything.

The variable countryTable is connected to the object in the interface builder.

Frustrated after a hard day of work. Anyone got the complete working code? That would be great. I already had a great look at apple's explenation AND various tutorials, but I can't figure it out.

I've tried multiple things, but this is my current code:

@interface myView: UIViewController
{
NSArray *countryArray;
IBOutlet UITableView * countryTable;
}
@property (nonatomic, retain) UITableView *countryTabel;
@end


and in my .m file

@implementation myView
@synthesize countryTable;

- (void)loadView
{
self.countryTable.dataSource = self;
}

- (void)viewDidLoad
{
NSArray *array = [[NSArray alloc] initWithObjects:@"test1", @"test2",
@"test3",nil];
self.countryTable = array;
[array release];

[super viewDidLoad];
// Do any additional setup after loading the view from its nib.


}

- (void) dealloc
{
[countryTable release];
[super dealloc];
}

#pragma mark -
#pragma mark Table View Data Source Methods

- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
return [self.countryTable count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:SimpleTableIdentifier] autorelease];
}

NSUInteger row = [indexPath row];
cell.textLabel.text = [countryTable objectAtIndex:row];
return cell;

}
@end

Answer

You are on the right track. If you were to use a UITableViewController subclass, you would obviously have a full screen table view by default. Going the route of using a UIViewController subclass with a UITableView as a subview in the UIViewController's view is the right way to go. A few things that you will need to address are:

1) In the UIViewControllers header file you will need to add <UITableViewDatasource, UITableViewDelegate> as your view controller is responsible for fill implementing this functionally.

2) In viewDidLoad:, set self.contryTable.delegate = self; and self.countryTable.datasource = self;

The following protocol methods need to be implemented like so:

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section {
    return countryArray.count; 
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

 -(UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
    if (cell == nil) {
         cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:SimpleTableIdentifier] autorelease];
    }

   NSUInteger row = [indexPath row];
   cell.textLabel.text = [countryArray objectAtIndex:row];

   return cell;

}

Hope this helps.

Comments