哪种方式更有效地验证多个文本字段已被修改?

时间:2015-01-30 00:58:15

标签: ios uitextfield

我有一个动态设置页面。这取决于用户的场景,设置页面内容将有所不同。如果用户修改了任何设置文本字段或切换器值,我需要立即通知。哪种方式在自定义设置视图中验证多个文本字段字符串的效率更高?

我有两个想法:

1,遍历所有子视图,如果子视图是textField或切换器,则将这些字符串或布尔值添加到一个NSDictionary obj中,并使用hash方法获取字典对象哈希值并存储它。当其他事件发生时,再次执行并比较两个哈希值。如果不同,则表示某些设置已被修改。

2,遍历所有子视图,将它们保存到NSDictionary中。当其他事件发生时,它将遍历所有子视图并分别比较每个文本字段或切换器值。如果发现任何比较不同,则表示设置页面有未保存的设置。

有没有其他智能方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

如何为每个控件添加标签,例如从值1到20(如果您有20个设置)。将每个设置的初始值存储在标记值位置的可变数组中(因此,如果标记为12,则存储在位置12)。制作此数组的副本,并在调整控件时将第二个数组中的新值存储在同一位置(使用前面的标记值)。然后当他们点击save时,只需用一个简单的循环比较两个数组之间的值。

希望这有帮助。

答案 1 :(得分:0)

在我的场景中,设置页面仍在开发中,视图中的对象将是动态的,取决于用户权限。对于安全性rasone,将设置复制到其他变量并不是一个好主意。有些人可能会更改设置,然后在查看其他设置后更改设置。如果使用简单标志来指示更改,则更改后备设置将被验证为已更改。

我的最终解决方案是使用md5哈希快照每个设置'值,只需获取最低4个字符和xor所有快照以获得一个长无符号整数(NSUInteger)哈希值。视图确实出现后,将此哈希值作为参考。当用户想要保存设置或弹出到父视图时,我们再次执行此哈希。然后与参考哈希值进行比较。

MD5功能

#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;
}

对于NSLog轻松

- (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;
}