好吧,我有两个ViewController
。一个是根,另一个是filterView,它在根视图控制器上应用一些过滤器。 FilterView上有一个TableView
,有多个选择选项。当我点击根视图上的UIButton
时,它会显示包含表格的过滤器视图,并从中选择多个选项,当我关闭filterView时,它成功地将其解除,并通过使用委托方法成功进行更改RootViewController
。
请参见下图,以获得更清晰的图像。左侧的按钮(三个水平条)将显示过滤器视图控制器,类似地,向下按钮将再次显示根视图。
我的问题是,当我再次按下按钮时,它会重新装满整个桌子。没有选定的值。我希望它保持选中的值,以便用户可以取消选中它们并检查新的过滤器值。
当用户点击过滤器按钮时,这是我使用的代码:
- (IBAction)filterButton:(id)sender
{
FilterViewController *arvc = [self.storyboard instantiateViewControllerWithIdentifier:@"FilterView"];
[self presentViewController:arvc animated:YES completion:nil];
}
对于FilterView上的后退按钮,我使用它:
[self dismissViewControllerAnimated:YES completion:nil];
那么我应该在后退按钮中写什么,以便它应该保留多个已检查的行并显示用户是否再次查看它。或者在背景中隐藏它并在需要时显示的东西。
答案 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];
}
就是这样!