是否有更简单,更少的复制/粘贴方式来实现与下面的代码相同的东西?什么是最好的方式?
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....
修改: 对不起它不是bool if语句(我相信我需要这个检查,否则在尝试从索引中获取标题时没有选择任何段时会崩溃)
我觉得我对这些if语句进行了大量的重复检查,并且不知道更好的方法,任何建议都表示赞赏。
答案 0 :(得分:4)
这种方法有几种方法。 (这里的代码都没有经过测试甚至编译过。)
最明显的是一种简单的方法:
- (void)setFormValueFromSegmentedControl:(UISegmentedControl *)seg forKey:(NSString *)key {
if (seg.selectedSegmentIndex !=-1) {
[self.form setValue:[seg titleForSegmentAtIndex:seg.selectedSegmentIndex] forKey:key];
}
}
现在您的代码简化为:
[self setFormValueFromSegmentedControl:self.title forKey:@"titleKey"];
[self setFormValueFromSegmentedControl:self.author forKey:@"authorKey"];
...
就我个人而言,我喜欢这个,因为用最少的魔法阅读它是如此简单明了。但是,即使那个街区变得笨拙,也有其他解决方案。
你可以做@Cyrille和@ H2CO3之类的建议:
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];
}
}
您还可以在控件上使用tag
来指示它适用于哪个表单键(您可以在IB中配置标记或在代码中使用setTag:
)。因此title
的标记为0,author
的标记为1,等等。
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
来保留映射。
有很多选择。但我有点像顶部的简单方法。这是最明显的。
答案 1 :(得分: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];
}
}