我有一个动态设置页面。这取决于用户的场景,设置页面内容将有所不同。如果用户修改了任何设置文本字段或切换器值,我需要立即通知。哪种方式在自定义设置视图中验证多个文本字段字符串的效率更高?
我有两个想法:
1,遍历所有子视图,如果子视图是textField或切换器,则将这些字符串或布尔值添加到一个NSDictionary obj中,并使用hash方法获取字典对象哈希值并存储它。当其他事件发生时,再次执行并比较两个哈希值。如果不同,则表示某些设置已被修改。
2,遍历所有子视图,将它们保存到NSDictionary中。当其他事件发生时,它将遍历所有子视图并分别比较每个文本字段或切换器值。如果发现任何比较不同,则表示设置页面有未保存的设置。
有没有其他智能方法来实现这一目标?
答案 0 :(得分:1)
如何为每个控件添加标签,例如从值1到20(如果您有20个设置)。将每个设置的初始值存储在标记值位置的可变数组中(因此,如果标记为12,则存储在位置12)。制作此数组的副本,并在调整控件时将第二个数组中的新值存储在同一位置(使用前面的标记值)。然后当他们点击save时,只需用一个简单的循环比较两个数组之间的值。
希望这有帮助。
答案 1 :(得分:0)
在我的场景中,设置页面仍在开发中,视图中的对象将是动态的,取决于用户权限。对于安全性rasone,将设置复制到其他变量并不是一个好主意。有些人可能会更改设置,然后在查看其他设置后更改设置。如果使用简单标志来指示更改,则更改后备设置将被验证为已更改。
我的最终解决方案是使用md5哈希快照每个设置'值,只需获取最低4个字符和xor所有快照以获得一个长无符号整数(NSUInteger)哈希值。视图确实出现后,将此哈希值作为参考。当用户想要保存设置或弹出到父视图时,我们再次执行此哈希。然后与参考哈希值进行比较。
#import <CommonCrypto/CommonCrypto.h>
- (NSUInteger) md5:(NSString *) input
{
const char *cStr = [input UTF8String];
unsigned char digest[16];
CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call
NSUInteger output = [[NSNumber numberWithUnsignedChar:digest[0]] intValue];
NSUInteger i;
i = (0x00000000|digest[3])<<24;
i = i|(0x00000000|digest[2])<<16;
i = i|(0x00000000|digest[1])<<8;
i = i|(0x00000000|digest[0])<<0;
output =i;
return output;
}
- (NSUInteger) hashSettings{
NSUInteger settingsHash = 0;
for (NSObject *obj in settingsScrollView.subviews){
if([obj isKindOfClass:[UITextField class]]){
UITextField *textField = (UITextField *)obj;
settingsHash = settingsHash ^ [self md5:textField.text];
}
if([obj isKindOfClass:[UISwitch class]]){
UISwitch *switcher = (UISwitch *)obj;
settingsHash = settingsHash ^ (switcher.isOn?switcher.hash:0xFFFFFFFF);
}
if([obj isKindOfClass:[UIButton class]]){
UIButton *button = (UIButton *)obj;
settingsHash = settingsHash ^ (button.isHidden?button.hash:0xFFFFFFFF);
}
}
NSLog(@"settings Hash : %@",[self getBitStringForInt:settingsHash]);
return settingsHash;
}
- (NSString *)getBitStringForInt:(NSUInteger)value {
NSString *bitsSting = @"";
for(int i = 0; i < 32; i ++) {
bitsSting = [NSString stringWithFormat:@"%i%@", value & (1 << i) ? 1 : 0, bitsSting];
}
return bitsSting;
}