解决方案!!
感谢乔希的耐心:D
因此,初始问题中的代码始终勾选所选单元格并取消选择先前选择的单元格,而不将任何内容保存到NSUserDefaults
. 在 Josh 的大量帮助之后,新代码(右下方)如下(与他的回复中完全相同/我只对其进行了一点清理并删除了之前尝试使其工作中定义的 @properties)。
用户点击 7 个单元格之一。然后将被点击单元格的 indexPath 保存在 中NSUserdefaults
,当再次打开 TableView 时,会在先前点击的单元格旁边显示一个复选标记。indexpath 始终保存在同一个目录中,NSObject
因此只会显示一个复选标记。
#import "CycleTableViewController.h"
#import "SettingsTableViewController.h"
@interface CycleTableViewController ()
@property (nonatomic) int selectedRow;
@end
@implementation CycleTableViewController
@synthesize array;
- (void)viewDidLoad {
//load array containing options
array=@[@"1", @"2", @"3", @"4", @"5", @"6", @"7"];
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void) viewWillDisappear:(BOOL)animated{
//save indexpath of tapped cell to NSUserdefaults
[[NSUserDefaults standardUserDefaults] setObject:@(indexPath.row) forKey:@"cycle"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [array count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIndentifier=@"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIndentifier forIndexPath:indexPath];
cell.textLabel.text = [array objectAtIndex:indexPath.row];
//display checkmark next to the tapped cell
if(indexPath.row == self.selectedRow){
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else{
ell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//assign indexpath to selectedRow, so NSUserdefaults can save them
self.selectedRow = indexPath.row;
[self.tableView reloadData];
}
//save indexpath of tapped cell to NSUserdefaults
[[NSUserDefaults standardUserDefaults] setObject:@(indexPath.row) forKey:@"cycle"];
[[NSUserDefaults standardUserDefaults] synchronize];
@end
最初的问题
我一直在阅读大量关于将索引路径保存到用户默认值的帖子,但没有一个对我有用......
在下面的 TableView 中,我有一个数据数组 (1-7),一旦按下单元格,就会显示并传递给另一个 ViewController。按下的单元格有一个复选标记,如果我使用导航控制器返回,我可以看到复选标记。一次只选择一项。如果我按另一行,复选标记会更改。
所以现在我想将所选行的索引路径保存到 UserDefaults (在 中didselectrowat indexpath
)并将其加载到viewdidload
但我总是得到一个build failed
,无论我尝试什么......
有人可以指出我正确的方向吗?这应该很容易,但我不知何故无法让它工作:/
更新代码!一旦我得到它的工作,我会上传完成的答案!
#import "CycleTableViewController.h"
#import "SettingsTableViewController.h"
@interface CycleTableViewController (){
NSString *currentCategory; // pointer to the currently checked item
}
// other @property declarations here or in your .m file
#define CHECKED_KEY @"kCheckedBoxKey"
@property (nonatomic) int selectedRow;
@end
@implementation CycleTableViewController
@synthesize array;
- (void)viewDidLoad {
//load tickmark according to newCell;
array=@[@"21+7", @"22+6", @"23+5", @"24+4", @"25+3", @"26+2", @"28"];
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void) viewWillAppear:(BOOL)animated {
self.selectedRow = [[[NSUserDefaults standardUserDefaults] objectForKey:@"cycle"] intValue];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [array count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIndentifier=@"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIndentifier forIndexPath:indexPath];
cell.textLabel.text = [array objectAtIndex:indexPath.row];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[[NSUserDefaults standardUserDefaults] setObject:@(indexPath.row) forKey:@"cycle"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSIndexPath *IndexPath = [NSIndexPath indexPathForRow:self.selectedRow inSection:0];
UITableViewCell *Cell = [tableView cellForRowAtIndexPath:IndexPath];
Cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
@end