1

我正在使用SASlideMenu库在我的 iOS ARC 故事板应用程序中实现左滑动菜单。我添加了三个用[self performSegueWithIdentifier:@"segueID" sender:self];代码调用的视图控制器,滑动菜单工作正常,但每次它创建视图控制器的新实例时,我需要缓存每个控制器内容(例如,在视图控制器 1 中,我们有一个文本字段: 如果我写一个词,换VC后我必须再次找到相同的词!)。这是通用的故事板:

在此处输入图像描述

这是我的 UITableView 委托,在 SASlideMenuViewController 中:

- (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];
}

这是应用程序中幻灯片菜单的屏幕截图:

在此处输入图像描述

在作者教程中,我可以阅读:“如果您使用动态单元格原型或使用静态单元格并且您想要缓存内容视图控制器,请分配一个标识符,该标识符将在segueIdForIndexPath:链接到所需 indexPath 的方法中返回”但我正在失去理智,我无法得到准确的观点..你能提供准确的代码来解决这个问题吗?还有一些东西要补充,但在哪里?我需要重现这种情况:每次我从左侧菜单中调用视图控制器时,我都必须检索它,就像我在另一个之前的 VC 调用之前离开时一样。谢谢!

4

1 回答 1

3

为了让您的代码正常工作,您需要实现SASlideMenuDataSource协议的两种方法,并且您必须初始化ViewController的datasource属性。此外,您必须避免直接调用performSegueWithIdentifier并且应该避免实现tableView:didSelectRowAtIndexPath:方法,否则缓存将不起作用。

第一个实现的方法是configureMenuButton:。您需要它,因为您需要滑入内容 ViewController 中的菜单按钮。一种可能性是复制示例项目中提供的图标并将它们添加到您的项目中:

-(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 回答