设置UITableView的委托和数据源(Set UITableView Delegate and

2019-06-25 21:58发布

这是我的问题:我有这个小UITableView在我的故事板:

这是我的代码:

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

现在,你可以看到,我要定名为myTableDelegate为代表和为myTable的数据源的实例。

这是SmallTable类的来源。

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

我实现所有UITableViewDelegateUITableViewDataSource方法的应用需要。 为什么它只是崩溃的观点出现之前?

谢谢!!

Answer 1:

rickster是正确的。 但我猜你需要使用一个strong ,在你结束预选赛的性质,因为viewDidLoad方法的对象无论如何都会被释放。

@property (strong,nonatomic) SmallTable *delegate;

// inside viewDidload

[super viewDidLoad];
self.delegate = [[SmallTable alloc] init];    
[self.myTable setDelegate:myTableDelegate];
[self.myTable setDataSource:myTableDelegate];

但没有任何理由使用一个分开的对象(数据源和委托)为你的餐桌? 你为什么不设置SmallViewController为源,为您的餐桌委托两者兼而有之?

另外,你没有创建正确的方式的单元格。 这些行什么也不做:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

// Configure the cell...
cell.textLabel.text = @"Hello there!";

dequeueReusableCellWithIdentifier简单地从表中“缓存”是已经创建了一个细胞检索和可重复使用(这避免内存消耗),但你还没有创建任何。

你在哪里做alloc-init ? 做到这一点,而不是:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell) {
    cell = // alloc-init here
}
// Configure the cell...
cell.textLabel.text = @"Hello there!";

而且说numberOfSectionsInTableView返回1,而不是0:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}


Answer 2:

大概你正在使用ARC? 你myTableDelegate只在一个局部变量引用viewDidLoad -一旦方法结束,它的释放。 (在委托/数据源模式,对象不拥有自己的代表,所以表视图的引用回到你的对象是弱)。我不希望单独导致崩溃,但很可能关键是你的问题。



Answer 3:

setDelegate不会保留委托。

numberOfSectionsInTableView方法必须返回1而不是0;



Answer 4:

(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 0;
}

段数应至少设置一个



Answer 5:

一个UITableView的对象的代表必须采用的UITableViewDelegate协议。 该协议的可选方法,允许委托管理的选择,配置部分的标题和页脚,帮助删除方法。



文章来源: Set UITableView Delegate and DataSource