web-dev-qa-db-ja.com

UITableView DelegateとDataSourceを設定する

これが私の問題です。ストーリーボードにこの小さなUITableViewがあります。enter image description here

そしてこれは私のコードです:

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のDelegateおよびDataSourceとして設定します。

これは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

アプリに必要なすべてのUITableViewDelegateおよびUITableViewDataSourceメソッドを実装しました。ビューが表示される前にクラッシュするのはなぜですか?

ありがとう!!

15
Marco Manzoni

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に0の代わりに1を返すように言います:

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

おそらくあなたはARCを使用していますか? myTableDelegateviewDidLoadのローカル変数でのみ参照されます-そのメソッドが終了すると、割り当てが解除されます。 (デリゲート/データソースパターンでは、オブジェクトがデリゲートを所有していないため、オブジェクトへのテーブルビューの参照は弱いものです。)これだけではクラッシュが発生するとは思われませんが、問題の原因となる可能性があります。

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

セクション数は少なくとも1つ設定する必要があります

1
Softec

setDelegateはデリゲートを保持しません。

そして

numberOfSectionsInTableViewメソッドは0ではなく1を返す必要があります。

1
Siva

UITableViewオブジェクトのデリゲートは、UITableViewDelegateプロトコルを採用する必要があります。プロトコルのオプションのメソッドを使用すると、デリゲートが選択を管理し、セクションのヘッダーとフッターを構成し、メソッドを削除することができます。

enter image description here