-
Notifications
You must be signed in to change notification settings - Fork 1
/
FFForm.m
104 lines (82 loc) · 3.04 KB
/
FFForm.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//
// FFForm.m
// prophets-ios
//
// Created by Benjamin Roesch on 1/12/13.
// Copyright (c) 2013 Benjamin Roesch. All rights reserved.
//
#import "FFForm.h"
#import "FFFormField.h"
#import "FFFormSection.h"
@implementation FFForm
-(id)initWithObject:(id)object sections:(NSArray *)sections{
self = [self init];
if (self) {
self.object = object;
self.sections = [sections mutableCopy];
[self initializeFieldValuesFromObject];
[self setInitialFirstResponder];
}
return self;
}
-(id)initWithObject:(id)object fields:(NSArray *)fields{
FFFormSection *section = [[FFFormSection alloc] initWithFields:fields title:nil];
return [self initWithObject:object sections:@[section]];
}
+(FFForm *)formForObject:(id)object withFields:(NSArray *)fields{
return [[FFForm alloc] initWithObject:object fields:fields];
}
-(void)setInitialFirstResponder{
BOOL hasInitialFirstResponder = NO;
FFFormField *initalFirstResponderCandidate = nil;
for (FFFormSection *section in self.sections){
for (FFFormField *field in section.fields) {
if(field.shouldBecomeFirstResponder){
hasInitialFirstResponder = YES;
break;
}
if (!initalFirstResponderCandidate && field.canBecomeFirstResponder) {
initalFirstResponderCandidate = field;
}
}
}
if (!hasInitialFirstResponder && initalFirstResponderCandidate) {
initalFirstResponderCandidate.shouldBecomeFirstResponder = YES;
}
}
-(void)initializeFieldValuesFromObject{
for (FFFormSection *section in self.sections) {
for (FFFormField *field in section.fields) {
field.currentValue = [self.object valueForKeyPath:field.attributeName];
}
}
}
-(void)serializeFormFieldValuesIntoObject{
for (FFFormSection *section in self.sections) {
for (FFFormField *field in section.fields) {
[self.object setValue:field.currentValue forKey:field.attributeName];
}
}
}
-(void)insertFormField:(FFFormField *)field inSection:(NSUInteger)sectionIndex atRow:(NSUInteger)rowIndex{
field.currentValue = [self.object valueForKeyPath:field.attributeName];
FFFormSection *section = [self.sections objectAtIndex:sectionIndex];
[section.fields insertObject:field atIndex:rowIndex];
if (self.delegate) {
[self.delegate formAddedField:field inSection:sectionIndex atRow:rowIndex];
}
}
-(void)removeFormFieldFromSection:(NSUInteger)sectionIndex atRow:(NSUInteger)rowIndex{
FFFormSection *section = [self.sections objectAtIndex:sectionIndex];
[section.fields removeObjectAtIndex:rowIndex];
if(self.delegate){
[self.delegate formRemovedFieldFromSection:sectionIndex atRow:rowIndex];
}
}
-(void)insertFormField:(FFFormField *)field atRow:(NSUInteger)rowIndex{
[self insertFormField:field inSection:0 atRow:rowIndex];
}
-(void)removeFormFieldAtRow:(NSUInteger)rowIndex{
[self removeFormFieldFromSection:0 atRow:rowIndex];
}
@end