UITableViewController 不应在关闭其 ViewController 时失去价值
UITableViewController should not lose value on dismissing its ViewController
好的,我有两个 ViewController
。一个是根视图,另一个是在根视图控制器上应用一些过滤器的 filterView。 FilterView 有一个 TableView
和多个 selection 选项。当我点击根视图上的 UIButton
时,它会显示具有 table 的过滤器视图,并且我 select 多个选项形成它,当我关闭 filterView 时,它成功地关闭了它并通过使用一个委托方法,它成功地对 RootViewController
进行了更改。
查看下图以获得更清晰的图片。左边的按钮(三个水平条)将显示过滤器视图控制器,类似地,向下按钮再次显示根视图。
我的问题是,当我再次点击按钮时,它会重新加载整个 table。没有 selected 值。我希望它保留选中的值,以便用户可以 un-check 它们并检查新的过滤器值。
当用户点击过滤器按钮时,这里是我正在使用的代码:
- (IBAction)filterButton:(id)sender
{
FilterViewController *arvc = [self.storyboard instantiateViewControllerWithIdentifier:@"FilterView"];
[self presentViewController:arvc animated:YES completion:nil];
}
对于 FilterView 上的后退按钮,我使用的是:
[self dismissViewControllerAnimated:YES completion:nil];
所以我应该在后退按钮中写些什么,以便它应该保留多个选中的行并在用户再次查看时显示。或者将它隐藏在后台并在需要时显示的东西。
当您按下过滤器按钮时,您正在创建一个全新的 FilterViewController,这就是为什么它不会有任何选择或前一个的任何内容。如果你想拥有持久性,你将需要始终呈现相同的(所以 instantiateViewControllerWithIdentifier 一次并将其保存在 属性 中,或者在创建它之后和在呈现它之前,将一些数据传递给它,以便它可以恢复它的状态(参见 Passing Data between View Controllers)
您可以使用 NSUserDefaults 保留选定的行,创建一个 indexPaths 数组,当您 select/deselect tableview 单元格时,add/remove indexPath to/from 数组。当您加载 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];
}
首先设置一个 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 步:
在您的 .h
文件中分配一个变量 FilterViewController *fvc;
第 2 步:
在您的 .m
文件中,在 ViewDidLoad
方法中写入这一行。
fvc = [self.storyboard instantiateViewControllerWithIdentifier:@"FilterView"];
第 3 步:
Copy/Paste 下面的代码作为您的 - (IBAction)filterButton:(id)sender
-
(IBAction)filterButton:(id)sender
{
[self presentViewController:fvc animated:YES completion:nil];
}
就是这样!
好的,我有两个 ViewController
。一个是根视图,另一个是在根视图控制器上应用一些过滤器的 filterView。 FilterView 有一个 TableView
和多个 selection 选项。当我点击根视图上的 UIButton
时,它会显示具有 table 的过滤器视图,并且我 select 多个选项形成它,当我关闭 filterView 时,它成功地关闭了它并通过使用一个委托方法,它成功地对 RootViewController
进行了更改。
查看下图以获得更清晰的图片。左边的按钮(三个水平条)将显示过滤器视图控制器,类似地,向下按钮再次显示根视图。
我的问题是,当我再次点击按钮时,它会重新加载整个 table。没有 selected 值。我希望它保留选中的值,以便用户可以 un-check 它们并检查新的过滤器值。
当用户点击过滤器按钮时,这里是我正在使用的代码:
- (IBAction)filterButton:(id)sender
{
FilterViewController *arvc = [self.storyboard instantiateViewControllerWithIdentifier:@"FilterView"];
[self presentViewController:arvc animated:YES completion:nil];
}
对于 FilterView 上的后退按钮,我使用的是:
[self dismissViewControllerAnimated:YES completion:nil];
所以我应该在后退按钮中写些什么,以便它应该保留多个选中的行并在用户再次查看时显示。或者将它隐藏在后台并在需要时显示的东西。
当您按下过滤器按钮时,您正在创建一个全新的 FilterViewController,这就是为什么它不会有任何选择或前一个的任何内容。如果你想拥有持久性,你将需要始终呈现相同的(所以 instantiateViewControllerWithIdentifier 一次并将其保存在 属性 中,或者在创建它之后和在呈现它之前,将一些数据传递给它,以便它可以恢复它的状态(参见 Passing Data between View Controllers)
您可以使用 NSUserDefaults 保留选定的行,创建一个 indexPaths 数组,当您 select/deselect tableview 单元格时,add/remove indexPath to/from 数组。当您加载 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];
}
首先设置一个 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 步:
在您的 .h
文件中分配一个变量 FilterViewController *fvc;
第 2 步:
在您的 .m
文件中,在 ViewDidLoad
方法中写入这一行。fvc = [self.storyboard instantiateViewControllerWithIdentifier:@"FilterView"];
第 3 步:
Copy/Paste 下面的代码作为您的 - (IBAction)filterButton:(id)sender
-
(IBAction)filterButton:(id)sender
{
[self presentViewController:fvc animated:YES completion:nil];
}
就是这样!