我正在创建一个iOS应用,我需要根据API调用的结果显示不同的视图。在我正在查询数据库,保存结果,然后使用此结果形成一个IF语句,我加载正确的视图,如此
CGRect rect = CGRectMake(180.0f, 24.0f, self.view.frame.size.width, self.view.frame.size.width);
JHView *myView = [[JHFewCloudsView alloc] initWithFrame:rect];
[self.view myView];
虽然这很有效,但它似乎很简单,就像一个简单任务的代码一样。有没有更好的方法来拥有多个视图?您可以在一个视图中使用多个- (void)drawRect:(CGRect)rect
,只需调用您需要的相关视频吗?
if ([icon isEqual: @"01d"])
{
CGRect rect = CGRectMake(180.0f, 24.0f, self.view.frame.size.width, self.view.frame.size.width);
JHSunView *sunView = [[JHSunView alloc] initWithFrame:rect];
[self.view addSubview:sunView];
} else if ([icon isEqualToString:@"02d"])
{
CGRect rect = CGRectMake(180.0f, 24.0f, self.view.frame.size.width, self.view.frame.size.width);
JHFewCloudsView *fewCloudsView = [[JHFewCloudsView alloc] initWithFrame:rect];
[self.view addSubview:fewCloudsView];
}
我现在这样做的方式意味着我最终会得到15种不同的视图和非常混乱的代码。
答案 0 :(得分:0)
如果您的代码与问题中显示的重复(唯一的区别是类名),那么您可以创建一个字典,其中键是if
语句中的字符串,值是名称类(作为字符串)。然后你的代码变成:
Class viewClass = NSClassFromString([self.viewConfig objectForKey:icon]);
CGRect rect = CGRectMake(180.0f, 24.0f, self.view.frame.size.width, self.view.frame.size.width);
UIView *newView = [[[viewClass alloc] initWithFrame:rect];
[self.view addSubview: newView];
答案 1 :(得分:0)
在Objective-C中,每个类都由一个对象(类型为Class
)表示,您可以像对待其他对象一样对待它。特别是,您可以使用Class
作为字典中的值,将其存储在变量中,然后发送消息。因此:
static NSDictionary *viewClassForIconName(NSString *iconName) {
static dispatch_once_t once;
static NSDictionary *dictionary;
dispatch_once(&once, ^{
dictionary = @{
@"01d": [JHSunView class],
@"02d": [JHFewCloudsView class],
// etc.
};
});
return dictionary;
}
- (void)setViewForIconName:(NSString *)iconName {
Class viewClass = viewClassForIconName(iconName);
if (viewClass == nil) {
// unknown icon name
// handle error here
}
CGRect rect = CGRectMake(180.0f, 24.0f, self.view.frame.size.width, self.view.frame.size.width);
UIView *view = [[viewClass alloc] initWithFrame:rect];
[self.view addSubview:view];
}