0

選択肢のリストを表示するカスタム キーボードを作成しようとしています。

UIViewのみを含むxib ファイル (に基づく) を作成しましたUITableView

ListKeyBoardView.h とListKeyBoardView.m(以下のコードを参照)を作成しました。私はListKeyBoardView.mnibファイルをロードしUITableView、xibからはInterface Builderを介してUITableViewに接続されています。nib ファイルをロードした後、UITableView. Interface Builderの と同じサイズなUITableViewので、正しく接続されているようです。ただし、アプリを実行してビューが表示されると、完全に空白になります。

コードでデリゲートとデータソースを設定しましたがUITableView、メソッドtableView:numberOfRowsInSection:が呼び出されます (6 が返されます) が、tableView:cellForRowAtIndexPath:呼び出されません。

他のエラーを確認するためUITableViewに、コードで手動で作成し (コメント行を参照)、正常に動作しています。私は何が欠けていますか?

#import "ListKeyBoardView.h"

@interface ListKeyBoardView () <UITableViewDelegate, UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *listTableView;
@property (strong, nonatomic) NSMutableArray *listData;

@end


@implementation ListKeyBoardView

- (id)init {
    return [self initWithFrame:CGRectMake(0, 0, 320, 250)];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
         [[NSBundle mainBundle] loadNibNamed:@"ListKeyboard" owner:self options:nil];
//        self.listTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)];

        NSLog(@"Frame = %f, %f", self.listTableView.frame.size.width, self.listTableView.frame.size.height);
        [self addSubview:self.listTableView];

        self.listTableView.delegate = self;
        self.listTableView.dataSource = self;

        [self.listTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"ListItem"];

        self.listData = [[NSMutableArray alloc] init];
        [self.listData addObject:@"een"];
        [self.listData addObject:@"twee"];
        [self.listData addObject:@"drie"];
        [self.listData addObject:@"vier"];
        [self.listData addObject:@"vijf"];
        [self.listData addObject:@"zes"];
    }
    return self;
}


#pragma mark UITableViewDataSource

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

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"ListItem";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    cell.textLabel.text = [self.listData objectAtIndex:indexPath.row];

    return cell;
}
@end
4

2 に答える 2

0

ここでの問題は、tableView がストーリーボードで作成されるため、initWithFrame ではなく initWithCoder が呼び出されることです。

解決するには、initWithFrame ではなく initWithCoder をオーバーライドし、init メソッドをオーバーライドして initWithFrame を呼び出さないでください。

于 2016-09-21T10:40:38.100 に答える