将一组布尔值保存到UITableView

时间:2015-07-20 19:57:28

标签: ios objective-c uitableview boolean nsarray

我想要完成的是构建一个UITableView,其中每个单元格右侧都有一个UISwitch,当用户再次打开应用程序时,交换机将保持在相应索引路径的开/关位置。

我创建了一个布尔数的NSArray并将它们保存到NSUser默认值但是有一些路障,同时循环返回它们以获得正确索引的bool,以将单元格切换开关设置为打开或关闭。

创建具有索引路径属性的自定义单元格会更好吗?那么只需要一个方法将bool保存到索引路径?

我对编程比较陌生,所以我想知道一些更高级的人认为这是最快捷,最简单的方法。

非常感谢!

这是我的布尔控制器,其中save方法是公共的,

#import "BoolController.h"

static NSString *const boolArrayKey = @"boolArrayKey";

@implementation BoolController

+ (BoolController *)sharedInstance {
static BoolController *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    sharedInstance = [BoolController new];
});

return sharedInstance;

}

- (void)saveBool:(BOOL)boolean {

NSArray *arrayOfBooleans = [[NSArray alloc]init];

arrayOfBooleans = [arrayOfBooleans arrayByAddingObject:[NSNumber         numberWithBool:boolean]];

[[NSUserDefaults standardUserDefaults]setObject:arrayOfBooleans     forKey:boolArrayKey];
[[NSUserDefaults standardUserDefaults]synchronize];

}

- (NSArray *)booleans {

   return [[NSUserDefaults standardUserDefaults]objectForKey:boolArrayKey];

}

@end

这里是索引路径方法

行的单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

UISwitch *toggleSwitch = [[UISwitch alloc]initWithFrame:CGRectMake(50, 10, 50, 30)];
[cell addSubview:toggleSwitch];

if (toggleSwitch.isOn == YES) {

    [[BoolController sharedInstance]saveBool:YES];
}

if (toggleSwitch.isOn == NO) {

    [[BoolController sharedInstance]saveBool:NO];
}

return cell;

}

2 个答案:

答案 0 :(得分:0)

据我了解你的问题,我得出以下结论:

  1. 您绝对应该尊重 MVC 模式 - 因此您不会将数据存储在UI对象中( VIEW )。
  2. 您的saveBool方法会在每次调用时创建一个新的数组实例,并在您将其同步到用户默认值时覆盖最近的实例。使用 CONTOLLER 中的ivar,而不是功能调用的范围......
  3. 您应该只获取行的索引路径,并将ON / OFF状态存储在数组的相同索引处。此数组是 MVC 设置中的 MODEL ...

    因此,下次创建tableview时,每一行(索引)都会从您的交换机的数组(索引)获得正确的bool!

答案 1 :(得分:0)

  1. 此开关是一个UI元素( VIEW )。你把它放在故事板的单元格中。所有你看到的都是UI - 表视图,你的单元格等。故事板中唯一不是UI的是视图控制器( CONTROLLER )。
  2. 对于这样一个小应用程序,您不需要为您的模型提供独立课程。无论如何,它将存储在您的用户默认值中... - >因此,只需将一个数组( MODEL )作为实例变量(或声明的属性)添加到视图控制器中。所以,只要你的观点存在,它就会活着。
  3. 无论何时循环遍历行索引 - 例如检查交换机的状态 - 使用for循环(i = 0 ... i ++)执行此操作,并且已经使用循环的i变量获取索引。因此,将该索引准确地写入您的数组中。当然,您首先在数组(数据 MODEL )中创建了具有相同索引的表视图 - 因此行和您的整个表 VIEW 反映你的 MODEL 数组。这样你总是保持同步。当用户移动开关( VIEW )时,您将收到通知它所在的行,并且瞧 - >更新 MODEL 数组,并使用模型的新信息刷新表 VIEW 。所有更新同步都应由 CONTROLLER
  4. 完成

    MODEL 是真实的。始终使用您在模型中找到的信息创建并刷新视图。如果 VIEW 发生变化 - 让 CONTROLLER 更新模型,反之亦然...... - 并且不时地更新您的用户默认值临时 MODEL 数组的值。因为如果应用程序崩溃或被系统杀死,您需要从用户默认值中读回阵列的模型值。如果它不是最新的,您将获得上次同步的值...

    总之,我建议您更多地了解iOS编程中的设计模式。这是每个应用程序的脚手架。没有它,你无论如何都会迷失方向。如果你没有那么多的阅读(这对于一个编程爱好者来说非常糟糕),一定要去 iTunes U ' - >斯坦福大学/保罗哈格蒂

    • 一起编码
    • iOS应用程序编程

    ObjC的2010 - 2014年讲座(有时每年两门课程) Swift的2014年末讲座。

    每个季度都有大约18个视频讲座。它们都涵盖相同的主题,只是扩展了添加到iOS的新技术的信息。 全部观看 - 从2010年开始 - 表格视图,例如在头几年得到更好的保障......

    这真是一个从绝对新手到(差不多)亲;-)的一个硬核corrida并且很有趣 - 这个人,他的知识和他的讲课方式简直太棒了。

    所以 - 足够说话 - 回去工作!

    有趣的探索SDK