iOS 사용자 정의 폼 인 스 턴 스 코드 구현

머리말
최근 에는 사용자 가 데 이 터 를 작성 하도록 한 뒤 서버 에 올 려 계산 하고 결 과 를 클 라 이언 트 에 되 돌려 보 여 주 는 앱 을 개발 하고 있다.그 중 작성 해 야 할 데이터 항목 은 10 여 개 에 달 하 며 대부분 필수 다.모든 폼 데 이 터 는 한 페이지 에서 이 루어 진다.앱 에서 이런 디자인 은 사실 매우 역겹다.그러나 제품 매니저 가 이렇게 하 겠 다 고 고집 하면 억지로 쓸 수 밖 에 없다.페이지 의 폼 데이터 스타일 은 다양 하 며,아래 그림 은 그 중 몇 줄 의 캡 처 입 니 다.

첫 번 째,두 줄 의 textfield 는 선택 상자 입 니 다.드 롭 다운 옵션 에서 만 선택 할 수 있 습 니 다.세 번 째 는 숫자 만 입력 할 수 있 습 니 다.
페이지 는 다른 학생 에 의 해 이 루어 집 니 다.폼 의 데 이 터 는 기본적으로 cellforRow AtIndexPath 에서 이 루어 집 니 다.결 과 는 다음 과 같 습 니 다.

이렇게 많아네트워크 인 터 페 이 스 를 어떻게 인수 하고 폼 데 이 터 를 올 리 라 고?설마 이렇게 많은 if...else...?이렇게 이 루어 진 후에 그 중의 한 줄 의 데 이 터 를 바 꾸 려 면 한 줄 의 양식 을 추가 하거나 삭제 하려 면 N 곳 을 바 꿔 야 한다.이렇게 하면 시간 을 낭비 할 뿐만 아니 라 실 수 를 하기 쉬 우 며,잘못 고치 거나 다 고치 지 않 았 다.이런 코드 는 후기 유지 보수 비용 이 너무 높 아서 다시 쓸 수 밖 에 없다.그럼 문제 가 생 겼 는데 어떻게 고 쳐 요?어디서부터 시작 할 까요?
XLForm
XLForm is the most flexible and powerful iOS library to create dynamic table-view forms. Fully compatible with Swift & Obj-C.
XLform 은 동적 폼 을 만 드 는 가장 유연 하고 강력 한 iOS 라 이브 러 리 입 니 다.더 많은 사용 방법 은 이 글 을 참고 할 수 있다.
다음은 이 라 이브 러 리 의 간단 한 구조 도 입 니 다.

가장 중요 한 것 은 빨간색 사각형 의 세 가지 유형 이다.XLformRow Descriptor,XLformSection Descriptor,XLformDescriptor.XLform Descriptor 구 조 는 UITablView 와 마찬가지 로 Section 이 있 고 Row 가 있 으 며 UITableView 의 데이터 소스 가 되 기 위해 설계 되 었 습 니 다.XLformRow Descriptor 는 줄 스타일,제목,줄 유형,선택 항목 내용,태그,합 법성 검증 등 각 줄 폼 의 데이터 내용 을 정의 합 니 다.XLformSection Descriptor 는 XLformRow Descriptor 를 조합 하여 만 든 것 이 고,XLformSection Descriptor 는 결국 XLformDescriptor 를 구성 했다.
우리 가 실현 하고 자 하 는 APP 표 의 단일 줄 스타일 이 더욱 복잡 하기 때문에 어떤 줄 은 두 가지 데 이 터 를 제출 해 야 하기 때문에 XLformRow Descriptor 를 변경 해 야 합 니 다.코드 는 다음 과 같 습 니 다:

@property (strong, nonatomic) NSMutableDictionary *cellConfig;
@property (strong, nonatomic) NSDictionary *textFieldConfig;
@property (strong, readonly, nonatomic) NSString *rowType;
@property (strong, readonly, nonatomic) NSArray *leftOptions;
@property (strong, readonly, nonatomic) WWEFormRightSelectorOption *rightOptions;
@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) id value;
@property (strong, nonatomic) NSString *tag;
@property (nonatomic) BOOL required;
@property (strong, nonatomic) WWEBaseTableViewCell *tableViewCell;
-(id)initWithRowType:(NSString *)rowType
  title:(NSString *)title
  leftOptions:(NSArray *)leftOptions
 rightOptions:(WWEFormRightSelectorOption *)rightOptions;
-(WWEFormValidation *)doValidation;
@end
@interface WWEFormRightSelectorOption : NSObject
@property (readonly, nonatomic) NSArray *rightOptions;
@property (readonly, nonatomic) NSString *httpParameterKey;
@property (readonly, nonatomic) NSString *selectorTitle;
@property (nonatomic) NSInteger selectedIndex;
+(WWEFormRightSelectorOption *)formRightSelectorOptionWithTitle:(NSString *)title      httpParameterKey:(NSString *)httpParameterKey      rightOptions:(NSArray *)rightOptions;
이렇게 하면 폼 데 이 터 는 UI 에 독립 되 고 TableView Cell 은 설정 할 수 있 습 니 다.XLformRow Descriptor 를 통 해 TableView Cell 을 설정 합 니 다.줄 유형 만 지정 하면 해당 유형의 Cell 을 드 립 니 다.TableView Controller 의 Cell 은 XLformRow Descriptor 에서 제공 합 니 다.

- (WWEBaseTableViewCell *)tableViewCell {
 if (!_tableViewCell) {
 id cellClass = [self cellClassesForRowDescriptorTypes][self.rowType];
 NSAssert(cellClass, @"Not defined XLFormRowDescriptorType: %@", self.rowType ?: @"");
 
 _tableViewCell = [[cellClass alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
 
 NSAssert([_tableViewCell isKindOfClass:[WWEBaseTableViewCell class]], @"UITableViewCell must extend from WWEBaseTableViewCell");
 _tableViewCell.rowDescriptor = self;
 }
 return _tableViewCell;
}
그러면 XLformRow Descriptor 는 어떻게 줄 에 따라 다른 cell 을 제시 합 니까?cell 은 같은 부 류 를 계승 해 야 합 니 다.이 부 류 는 충분히 간단 합 니 다.하나의 WWEFormRow Descriptor 속성 만 있 고 다른 실현 해 야 할 방법 은 WWECellProtocal 이 책임 집 니 다.

@class WWEFormRowDescriptor;
@interface WWEBaseTableViewCell : UITableViewCell<WWECellProtocal>
@property (nonatomic, weak) WWEFormRowDescriptor *rowDescriptor;
@end

@class WWEFormRowDescriptor;
@protocol WWECellProtocal <NSObject>
@required
@property (nonatomic, weak) WWEFormRowDescriptor *rowDescriptor;
-(void)configure;
-(void)update;
@end
또한 폼 설정 데 이 터 를 코드 에 쓰 는 것 이 아니 라 독립 적 으로 설정 합 니 다.plist 파일 을 사용 하면 form 을 초기 화 할 때 이 파일 만 읽 으 면 cell 설정 이 완 료 됩 니 다.다음 에 폼 의 내용 을 바 꾸 려 면 스타일 을 바 꾸 지 않 고 plist 파일 만 수정 하고 코드 를 바 꾸 지 않 아 도 됩 니 다.

마지막 으로 TableView Controller 의 코드 는 특히 간단 합 니 다.

이렇게 폼 데 이 터 를 올 리 는 것 은 매우 수월 하 다 [self.form localValidationErrors] 데이터 의 합 법성 을 검증 하고 모두 합 법 적 이면 다시 호출 할 수 있다 [self.form httpParameters] 모든 폼 데 이 터 를 얻 고 네트워크 인터페이스 에 전달 하면 큰 성 과 를 거 둘 수 있다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기