これが私の問題です。ストーリーボードにこの小さな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の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
メソッドを実装しました。ビューが表示される前にクラッシュするのはなぜですか?
ありがとう!!
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;
}
おそらくあなたはARCを使用していますか? myTableDelegate
はviewDidLoad
のローカル変数でのみ参照されます-そのメソッドが終了すると、割り当てが解除されます。 (デリゲート/データソースパターンでは、オブジェクトがデリゲートを所有していないため、オブジェクトへのテーブルビューの参照は弱いものです。)これだけではクラッシュが発生するとは思われませんが、問題の原因となる可能性があります。
(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 0;
}
セクション数は少なくとも1つ設定する必要があります
setDelegate
はデリゲートを保持しません。
そして
numberOfSectionsInTableView
メソッドは0ではなく1を返す必要があります。
UITableViewオブジェクトのデリゲートは、UITableViewDelegateプロトコルを採用する必要があります。プロトコルのオプションのメソッドを使用すると、デリゲートが選択を管理し、セクションのヘッダーとフッターを構成し、メソッドを削除することができます。