1

SASlideMenuライブラリを使用して、 iOSARCストーリーボードアプリに左側のスライドメニューを実装しています。コードで呼び出される3つのViewControllerを追加しましたが[self performSegueWithIdentifier:@"segueID" sender:self];、スライドメニューは正常に機能しますが、各コントローラーのコンテンツをキャッシュする必要があるときに、View Controllerの新しいインスタンスを作成するたびに(たとえば、View Controller 1にはテキストフィールドがあります)、 :単語を書く場合、VCを変更した後、同じ単語をもう一度見つける必要があります!)。これは一般的なストーリーボードです。

ここに画像の説明を入力してください

これは、SASlideMenuViewControllerのUITableViewデリゲートです。

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:
                 UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"];
    }

    if (indexPath.row == 0) {
        cell.textLabel.text = @"ViewController 1";
    }
    if (indexPath.row == 1) {
        cell.textLabel.text = @"ViewController 2";
    }
    if (indexPath.row == 2) {
        cell.textLabel.text = @"ViewController 3";
    }

    cell.textLabel.font = [UIFont systemFontOfSize:14];
    cell.textLabel.textColor = [UIColor blackColor];
    cell.imageView.image = [UIImage imageNamed:@"image.png"];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    if(indexPath.row==0)
    {
        [self performSegueWithIdentifier:@"segueID1" sender:self]; // I NEED TO RETRIEVE SAME VIEW CONTROLLER 1 CONTENT AFTER ANOTHER VIEW CONTROLLER CALL!
    }

    if(indexPath.row==1)
    {
        //[self performSegueWithIdentifier:@"segueID2" sender:nil]; // I NEED TO RETRIEVE SAME VIEW CONTROLLER 2 CONTENT AFTER ANOTHER VIEW CONTROLLER CALL!
    }

    if(indexPath.row==2)
    {
        //[self performSegueWithIdentifier:@"segueID3" sender:nil]; // I NEED TO RETRIEVE SAME VIEW CONTROLLER 3 CONTENT AFTER ANOTHER VIEW CONTROLLER CALL!
    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

そして、これはアプリのスライドメニューのスクリーンショットです:

ここに画像の説明を入力してください

著者のチュートリアルでは、次のように読むことができます。「動的セルプロトタイプを使用している場合、または静的セルを使用していて、コンテンツビューコントローラーをキャッシュする場合は、目的のindexPathにリンクされたsegueIdForIndexPath:メソッドで返される識別子を割り当てます。 」しかし、頭がおかしくなり、正確なポイントがわかりません。これを解決するための正確なコードを提供していただけますか?他に追加するものがありますが、どこにありますか?この状況を再現する必要があります。左側のメニューからViewControllerを呼び出すたびに、前のVC呼び出しの前に残したものと同じものを取得する必要があります。ありがとう!

4

1 に答える 1

3

コードを機能させるには、 SASlideMenuDataSourceプロトコルの2つのメソッドを実装する必要があり、ViewControllerのdatasourceプロパティを初期化する必要があります。さらに、 performSegueWithIdentifierを直接呼び出すことは避けなければならず、 tableView:didSelectRowAtIndexPath:メソッドを実装することは避けてください。そうしないと、キャッシュが機能しません。

実装する最初のメソッドはconfigureMenuButtonです。スライドインしているコンテンツViewControllerのメニューボタンが必要なため、これが必要です。1つの可能性は、サンプルプロジェクトで提供されているアイコンをコピーして、プロジェクトに追加することです。

-(void) configureMenuButton:(UIButton *)menuButton{
    menuButton.frame = CGRectMake(0, 0, 40, 29);
    [menuButton setImage:[UIImage imageNamed:@"menuicon.png"] forState:UIControlStateNormal];
    [menuButton setBackgroundImage:[UIImage imageNamed:@"menu.png"] forState:UIControlStateNormal];
    [menuButton setBackgroundImage:[UIImage imageNamed:@"menuhighlighted.png"] forState:UIControlStateHighlighted];
    [menuButton setAdjustsImageWhenHighlighted:NO];
    [menuButton setAdjustsImageWhenDisabled:NO];
}

segueIdForIndexPathを実装する必要があるよりも: 。このメソッドは、メニューの行のindexPathに関連付けられたsegueIdを返します。コードを見ると、次のようになります。

-(NSString*) segueIdForIndexPath:(NSIndexPath *)indexPath{
    if(indexPath.row==0){
        return @"vista1";
    } else if (indexPath.row==1){
        return @"vista2";
    }else if(indexPath.row==2){
        return @"vista3";
    }
    return @"vista1";
}

最後に、 ViewControllerのdataSourceプロパティを正しく初期化する必要があります。

-(id) initWithCoder:(NSCoder *)aDecoder{
    if (self = [super initWithCoder:aDecoder]) {
        self.slideMenuDataSource = self;
    }
    return self;
}

答えがお役に立てば幸いです。

于 2013-03-25T13:00:11.740 に答える