Set UITableView Delegate and DataSource
Solution 1
rickster is right. But I guess you need to use a strong
qualifier for your property since at the end of your viewDidLoad
method the object will be deallocated anyway.
@property (strong,nonatomic) SmallTable *delegate;
// inside viewDidload
[super viewDidLoad];
self.delegate = [[SmallTable alloc] init];
[self.myTable setDelegate:myTableDelegate];
[self.myTable setDataSource:myTableDelegate];
But is there any reason to use a separated object (data source and delegate) for your table? Why don't you set SmallViewController
as both the source and the delegate for your table?
In addition you are not creating the cell in the correct way. These lines do nothing:
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
cell.textLabel.text = @"Hello there!";
dequeueReusableCellWithIdentifier
simply retrieves from the table "cache" a cell that has already created and that can be reused (this to avoid memory consumption) but you haven't created any.
Where are you doing alloc-init
? Do this instead:
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell) {
cell = // alloc-init here
}
// Configure the cell...
cell.textLabel.text = @"Hello there!";
Furthermore say to numberOfSectionsInTableView
to return 1 instead of 0:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
Solution 2
Presumably you're using ARC? Your myTableDelegate
is only referenced in a local variable in viewDidLoad
-- once that method ends, it's deallocated. (In the delegate/datasource pattern, objects do not own their delegates, so the table view's references back to your object are weak.) I wouldn't expect that alone to cause a crash, but it's likely key to your problem.
Solution 3
setDelegate
will not retain the delegate.
And
numberOfSectionsInTableView
method has to return 1 instead of 0;
Solution 4
(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 0;
}
Number of sections should be set at least one
Marco Manzoni
Updated on April 27, 2020Comments
-
Marco Manzoni about 4 years
This is my problem: I have this small
UITableView
in my storyboard:And this is my code:
SmallTableViewController.h
#import <UIKit/UIKit.h> #import "SmallTable.h" @interface SmallViewController : UIViewController @property (weak, nonatomic) IBOutlet UITableView *myTable; @end
SmallTableViewController.m
#import "SmallViewController.h" @interface SmallViewController () @end @implementation SmallViewController @synthesize myTable = _myTable; - (void)viewDidLoad { SmallTable *myTableDelegate = [[SmallTable alloc] init]; [super viewDidLoad]; [self.myTable setDelegate:myTableDelegate]; [self.myTable setDataSource:myTableDelegate]; // Do any additional setup after loading the view, typically from a nib. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } @end
Now as you can see, I want to set an instance called myTableDelegate as Delegate and DataSource of myTable.
This is the Source of SmallTable class.
SmallTable.h
#import <Foundation/Foundation.h> @interface SmallTable : NSObject <UITableViewDelegate , UITableViewDataSource> @end
SmallTable.m
@implementation SmallTable - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 0; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. return 5; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // Configure the cell... cell.textLabel.text = @"Hello there!"; return cell; } #pragma mark - Table view delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"Row pressed!!"); } @end
I implemented all the
UITableViewDelegate
andUITableViewDataSource
method that the app need. Why it just crash before the view appear??Thanks!!
-
Marco Manzoni almost 12 yearsOK, I have just create a new @property (weak,nonatomic) SmallTable *delegate; Now the application doesn't crash, but... the table view is empty! I can not figure out why...