2013-07-12 3 views
1

아래 코드와 동일한 효과를 얻기 위해 복사/붙여 넣기가 더 쉽고 간편합니다. 가장 좋은 방법은 무엇입니까?메서드를 실행하기 전에 각 bool을 확인하는 더 쉬운 방법은 무엇입니까?

if (self.title.selectedSegmentIndex !=-1) 
{ 
    [self.form setValue:[self.title titleForSegmentAtIndex:self.title.selectedSegmentIndex] forKey:@"titleKey"]; 
} 
if (self.author.selectedSegmentIndex !=-1) 
{ 
    [self.form setValue:[self.author titleForSegmentAtIndex:self.author.selectedSegmentIndex] forKey:@"authorKey"]; 
} 
if (self.description.selectedSegmentIndex !=-1) 
{ 
    [self.form setValue:[self.description titleForSegmentAtIndex:self.description.selectedSegmentIndex] forKey:@"descriptionKey"]; 
} 
etc.... 

편집 : 미안이 아니 부울 if 문

(I 인덱스에서 제목을 얻으려고 할 때, 그렇지 않으면 어떤 세그먼트를 선택하지 않은 경우 충돌합니다, 그래도 난이 검사를 필요로 생각)

나는 이러한 if 문을 반복적으로 검사하고 더 나은 방법을 모르는 것처럼 느껴진다. 모든 제안은 감사 할 만하다.

+0

힌트 : 대신': 당신이 올바르게 속성을 만든 경우, 당신은'[@ "제목"자기 valueForKey]을 사용할 수 있습니다 'self.title'의 그런 다음 키 배열을 반복하는 것처럼 간단 할 수 있습니다. – Cyrille

+0

@Cyrille 정확히, 그런 식으로'for (keysArray에있는 NSString * 키) {id val = [self valueForKey : key]; if (val) [self.form setValue : val forKey : key]; }' –

+1

@Cyrille Im 죄송합니다. 내 속성을 올바르게 만들었다는 것이 무엇을 의미합니까? – BluGeni

답변

4

이러한 종류의 작업에는 여러 가지 방법이 있습니다. (여기에 코드 중에 시험을 실시하지 또는 컴파일되었습니다.)

가장 확실한 간단한 방법입니다 :

[self setFormValueFromSegmentedControl:self.title forKey:@"titleKey"]; 
[self setFormValueFromSegmentedControl:self.author forKey:@"authorKey"]; 
... 

는 개인적으로 내가 좋아하는 :

- (void)setFormValueFromSegmentedControl:(UISegmentedControl *)seg forKey:(NSString *)key { 
    if (seg.selectedSegmentIndex !=-1) { 
    [self.form setValue:[seg titleForSegmentAtIndex:seg.selectedSegmentIndex] forKey:key]; 
    } 
} 

이제 코드가 단순화 이것은 최소한의 마법으로 읽기가 너무 간단하고 명백하기 때문입니다. 하지만 그 블록조차 다루기 힘들다면 다른 해결책이 있습니다.

for (NSString *key in [@"title", @"author", ...]) { 
    UISegmentedControl *seg = [self valueForKey:key]; 
    if (seg.selectedSegmentIndex != -1) { 
    NSString *formKey = [key stringByAppendingString:@"Key"]; 
    [self.form setValue:[seg titleForSegmentAtIndex:seg.selectedSegmentIndex] forKey:formKey]; 
    } 
} 

당신은 또한에 적용 키를 형성 (당신이 IB에 태그를 구성 할 수있는 표시하기 위해 컨트롤의 tag를 사용할 수 없거나 사용 :

당신은 @Cyrille와 @의 H2CO3과 같은 작업을 수행 할 수 있습니다 제안하는 코드에서 setTag:). 그래서 title 0의 태그를 것, author

NSArray *formKeyForTag = @[@"titleKey", @"authorKey", ...]; 
for (UISegmentedControl *seg = [... IBOutletCollection of controls ...]) { 
    if (seg.selectedSegmentIndex != -1) { 
    NSString *formKey = formKeyForTag[seg.tag]; 
    [self.form setValue:[seg titleForSegmentAtIndex:seg.selectedSegmentIndex] forKey:formKey]; 
    } 

하나의 태그 등 것이다 또는 당신은 양식 키를 가리키는 세그먼트 제어에 관련된 객체를 추가 할 수 있습니다. 이에 대한 자세한 내용은 What is objc_setAssociatedObject() and in what cases should it be used?을 참조하십시오. (나는 관련 객체를 좋아합니다.)

또는 NSDictionary을 사용하여 매핑을 유지할 수 있습니다.

많은 옵션이 있습니다. 그러나 나는 일종의 단순한 방법과 비슷합니다. 가장 확실합니다.

+0

와우 감사합니다. 그러한 완전한 대답을 위해, 나는 첫 번째 것을 좋아한다. 그것은 최소한의 일을 간단하게 유지한다. – BluGeni

+0

롭 좋다. 그를 믿어 라.) – Cyrille

0
@protocol ObjectsWithSegmentAtIndex <NSObject> 

@property (assign, atomic) NSInteger selectedSegmentIndex; 

@end 

.H

@interface BaseClass : NSObject  
@property (assign, atomic) id<ObjectsWithSegmentAtIndex> title; 
@property (assign, atomic) id<ObjectsWithSegmentAtIndex> description; 
... 
@property (assign, atomic) Form* form; 
@end 

하는 .m

NSString* KeyForValue (id<ObjectsWithSegmentAtIndex> value) { 
    return [value description]; // example, not to be used this way 
} 

+(void) fillForm:(Form*)form withValues:(NSArray*) values { 
    for (id<ObjectsWithSegmentAtIndex> value in values) { 
     [self fillForm:form withValue:value forKey:KeyForValue(value)]; 
    } 
} 

+(void) fillForm:(Form*)form withValue:(id<ObjectsWithSegmentAtIndex>)value forKey:(id<NSCopying>)key { 
    if (value.selectedSegmentIndex != kUndefinedSegmentIndex) { 
     [form setValue:[value titleForSegmentAtIndex:value.selectedSegmentIndex] forKey:key]; 
    } 
} 
관련 문제