-3

tableView が didSelectRowAtIndexPath メソッドを起動しないという問題があります。デリゲートを次のように実装しました。

@interface ViewController : UIViewController<UITableViewDataSource, UITableViewDelegate,UIScrollViewDelegate>

そして、私のストーリーボードでは、tableView のデータ ソースとデリゲートの両方がベース ビュー コントローラーを指しています。ユーザー インタラクションを有効にし、選択を単一選択に設定しました。タップ ジェスチャがビューにバインドされておらず、チェックしても起動しないため、TapGesture の問題ではありません。

これは、テーブルをセットアップするためのコードです。

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return menuArray.count;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"menuCell"];
    NSDictionary *menuItem = [menuArray objectAtIndex:indexPath.row];

    cell.textLabel.text = menuItem[@"Title"];
    cell.detailTextLabel.text = menuItem[@"Subtitle"];
    return cell;
}
-(void)showMenu{
    [UIView animateWithDuration:.25 animations:^{
        [content setFrame:CGRectMake(menuTable.frame.size.width, content.frame.origin.y, content.frame.size.width, content.frame.size.height)];
    }];
}
-(void)hideMenu{
    [UIView animateWithDuration:.25 animations:^{
    [content setFrame:CGRectMake(0, content.frame.origin.y, content.frame.size.width,     content.frame.size.height)];
    }];
}
-(IBAction)showMenuDown:(id)sender {
    if(content.frame.origin.x == 0)
        [self showMenu];
    else
        [self hideMenu];
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    //whatever
}

テーブルは最初はストーリーボードで表示されていません (origin.x は -150 に設定されています)。その後、ユーザーがナビゲーションバーのボタンをクリックすると、ビューがスライドして表示されます。これが問題の原因となっている可能性があります。考える。

これが機能しない原因となるコードまたは実装に何か問題がありますか?

4

2 に答える 2

0
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"menuCell"];

セルが作成されなかった場合、これは nil を返します。

そのため、セルが nil かどうかを確認することは必須です。そうであれば、セルを作成する必要があります。

static NSString *CellIdentifier = @"menuCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil) {
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
}

ストーリーボードを使用しているので、代わりに使用できます

UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

プロトタイプセル用。ストーリーボードで同じ識別子を使用し、セルのクラスを登録したことを確認してください

- (void) viewDidLoad {
   [super viewDidLoad];

   [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"menuCell"];
} 
于 2013-08-26T20:41:00.367 に答える
0

テーブルにディクショナリの値が既に入力されている場合は、データ ソースとデリゲートを問題から除外できます。つまり、ストーリーボード接続が機能しています。

あなたのコードは私にはうまく見えます。私が見る唯一の違いは、通常、このようにテーブルを定義することです。これを試して、役立つかどうかを確認してください。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    //NSLog(@"Inside cellForRowAtIndexPath");

    static NSString *CellIdentifier = @"Cell";

    // Try to retrieve from the table view a now-unused cell with the given identifier.
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // If no cell is available, create a new one using the given identifier.
    if (cell == nil)
    {
        // Use the default cell style.
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

//Your code here
// ....

return cell;

}
于 2013-08-26T20:29:51.517 に答える