UITableViewController在解除其ViewController时不应该失去价值

时间:2015-01-02 11:53:48

标签: ios objective-c uitableview uiviewcontroller

好吧,我有两个ViewController。一个是根,另一个是filterView,它在根视图控制器上应用一些过滤器。 FilterView上有一个TableView,有多个选择选项。当我点击根视图上的UIButton时,它会显示包含表格的过滤器视图,并从中选择多个选项,当我关闭filterView时,它成功地将其解除,并通过使用委托方法成功进行更改RootViewController
请参见下图,以获得更清晰的图像。左侧的按钮(三个水平条)将显示过滤器视图控制器,类似地,向下按钮将再次显示根视图。 Image defines the two views I have 我的问题是,当我再次按下按钮时,它会重新装满整个桌子。没有选定的值。我希望它保持选中的值,以便用户可以取消选中它们并检查新的过滤器值。

当用户点击过滤器按钮时,这是我使用的代码:

- (IBAction)filterButton:(id)sender
{
    FilterViewController *arvc = [self.storyboard instantiateViewControllerWithIdentifier:@"FilterView"];
    [self presentViewController:arvc animated:YES completion:nil];
}

对于FilterView上的后退按钮,我使用它:

[self dismissViewControllerAnimated:YES completion:nil];

那么我应该在后退按钮中写什么,以便它应该保留多个已检查的行并显示用户是否再次查看它。或者在背景中隐藏它并在需要时显示的东西。

4 个答案:

答案 0 :(得分:1)

首先将NSMutableArray设置为

    NSMutableArray *SelectedRows;

现在在你的视图上加载了NSUserDefault

 NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults];
SelectedRows = [NSMutableArray arrayWithArray:[userDef objectForKey:@"SelectedRows"]];

你的TableView cellForRowAtIndexPath方法写得像

static NSString *CellIdentifier=@"Cell";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
   //yourCode
}
NSNumber *obj = [NSNumber numberWithInteger:indexPath.row];
if ([SelectedRows containsObject:obj])
{
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
    cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;

你的didSelectRowAtIndexPath看起来像

NSNumber *obj = [NSNumber numberWithInteger:indexPath.section];
if ([SelectedRows containsObject:obj])
{
    [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
    [SelectedRows removeObject:obj];
    [tableView reloadData];
}
else
{
    [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
    [SelectedRows addObject:obj];
    [tableView reloadData];
}

NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults];
[userDef setObject:SelectedRows forKey:@"SelectedRows"];
[userDef synchronize];

希望它能帮到你。

答案 1 :(得分:0)

当您按下过滤器按钮时,您正在创建一个全新的FilterViewController,这就是为什么它不会有任何选择或前一个选择。如果你想拥有持久性,你需要始终呈现相同的一个(这样做 instantiateViewControllerWithIdentifier 一次并将其保存在属性中,或者在创建它之后和呈现之前,传递一些数据它可以恢复它的状态(见Passing Data between View Controllers

答案 2 :(得分:-1)

您可以使用NSUserDefaults保留选定的行,创建一个indexPaths数组,当您选择/取消选择tableview单元格时,在数组中添加/删除indexPath。加载tableView时,只需检查数组中是否存在indexPath,然后保持选中状态。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    _indexPathArray = [[NSMutableArray alloc] init];
   _indexPathArray  =  [[NSUserDefaults standardUserDefaults] objectForKey:@"selectedRows"];

}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = [NSString stringWithFormat:@"Row %ld", (long)indexPath.row];

    if ([_indexPathArray containsObject:indexPath]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;

}

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

    if ([_indexPathArray containsObject:indexPath]) {
        [_indexPathArray removeObject:indexPath];
    }
    else {
        [_indexPathArray addObject:indexPath];
    }

    [[NSUserDefaults standardUserDefaults] setObject:_indexPathArray forKey:@"selectedRows"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [self.tableView reloadData];
}

答案 3 :(得分:-1)

第1步:
.h文件中指定变量FilterViewController *fvc;
第2步:
.m文件中,在ViewDidLoad方法中写下此行。
fvc = [self.storyboard instantiateViewControllerWithIdentifier:@"FilterView"];
第3步:
将下面的代码复制/粘贴为- (IBAction)filterButton:(id)sender -

(IBAction)filterButton:(id)sender
{
    [self presentViewController:fvc animated:YES completion:nil];
}

就是这样!