如何从字典输入中更改 UITableview 的数组内容?
Posted
技术标签:
【中文标题】如何从字典输入中更改 UITableview 的数组内容?【英文标题】:How to change UITableview's array content from a dictionary input? 【发布时间】:2011-09-17 22:27:26 【问题描述】:我有许多不同的数组,其中包含数据模型类中的酒店字典。例如,数组madridHotels
将保存马德里酒店的字典。为了在表格视图中列出这些酒店,我在 dataModel 类中使用了一个名为 madridHotelsCount
的方法:
-(int)madridHotelsCount
return self.madridHotels.count;
在 tableview 的 numberOfRowsInSection
方法中,我会放
- (NSInteger)tableView:(UITableView*)theTableView numberOfRowsInSection:(NSInteger)section
return [self.dataModel madridHotelsCount];
为了列出马德里的酒店。这工作得很好。但是因为我有大约 20 个城市,我觉得有 20 个不同的 VC 和 XIB 来制作基于城市的 tableview 显然是愚蠢和浪费的。
在我的“选择城市”表格视图中,每个城市都有一个名为 cityString
的键,其中包含用于“X 市酒店”表格视图的相应字符串。例如,在马德里的情况下,字符串是madridHotelsCount
。如果我没记错的话,有一种方法可以在推送“X 市酒店”tableview 控制器时使用此信息。
我不知道如何在 tableview 方法中更改字符串 madridHotelsCount
,例如,barcelonaHotelsCount
取决于“选择城市”tableview 中的一个键,以便我只能使用一个 VC和 XIB。
希望这是有道理的......
【问题讨论】:
dataModel
是否包含每个酒店的数组?如果是这样,您可能希望更好地构建该类?
是的。在dataModel
中,我有一个包含所有酒店的数组,名为hotels
。然后,我有 20 个不同的数组,其中包含不同城市的酒店(它们是酒店数组的副本,根据城市过滤)。我认为这种结构非常合理,但欢迎任何其他方法!
这听起来非常不可扩展,每次添加新城市时都需要添加新的 ivar。使用NSDictionary
,键是城市,值是酒店的NSArray
谢谢,Paul.s。您能否进一步扩展您的方法?
【参考方案1】:
您需要将其更改为类似这样,以便将酒店传递到每个视图。
-(int)hotelCountForCity:(NSString *)cityName
我会重写它,让它更通用,因为你不应该那样重复自己。
虽然它不是最好的方法,但如果所有代码都已经存在,你可以..
NSString city = @"madrid";
SEL selector = selectorFromString([NSString stringWithFormat:@"%@HotelsCount", city]);
int count = 0;
if([self respondsToSelector:selector])
int *count = [self performSelector:selector];
【讨论】:
谢谢大哥。在您的示例中,我会像return [self.dataModel hotelCountForCity];
一样使用它吗?如果是这样,我将如何获得cityName
?
对不起,我在您的帖子完成之前发表了评论...让我研究一下。
这看起来很讨厌而且不是很面向对象。我现在鼓励重写课程。我认为您在选择器之前已经成为赢家。也许重组数据模型以使用NSDictionary
,键是cityNames,值是酒店的NSArray
【参考方案2】:
更改dataModel
中的数据结构以使用
@property (nonatomic, retain) NSDictionary *citiesHotels;
城市是键,值是酒店数组。
一个例子可能是这样的
NSArray *madrid = [[NSArray alloc] initWithObjects:@"madridHotelA", @"madridHotelB", nil];
NSArray *barcelona = [[NSArray alloc] initWithObjects:@"barcelonaHotelA", @"barcelonaHotelB", nil];
NSDictionary *citiesHotels = [[NSDictionary alloc] initWithObjectsAndKeys:madrid, @"Madrid", barcelona, @"barcelona", nil];
[madrid release]; madrid = nil;
[barcelona release]; barcelona = nil;
self.citiesHotels = citiesHotels;
[citiesHotels release]; citiesHotels= nil;
像这样向模型添加方法
- (NSInteger)hotelCountForCity:(NSString *)city
int count = 0;
NSArray *hotels = [self.citiesHotels valueForKey:city];
if (hotels)
count = [hotels count];
return count;
要获得酒店,您的模型中需要这样的东西
- (Hotel *)hotelAtIndex:(NSInteger)index forCity:(NSString *)city
NSArray * hotels = [self.citiesHotels valueForKey:city];
return [hotels objectAtIndex:index];
这些都是这样称呼的
- (NSInteger)tableView:(UITableView*)theTableView numberOfRowsInSection:(NSInteger)section
return [self.dataModel hotelCountForCity:theSelectedCityName];
然后在 `cellForRowAtIndexPath 你做
Hotel *hotel = [self.dataModel hotelAtIndex:indexPath.row forCity:theSelectedCity];
【讨论】:
哇...我开始明白你在说什么了。让我考虑一下。我会告诉你进展如何。 在tableview的cellForRowAtIndexPath
中,我调用Hotel* hotel = [self.dataModel hotelAtIndex:indexPath.row];
。该方法在 dataModel 中描述为:(Hotel*)hotelAtIndex:(int)index return [self.hotels objectAtIndex:index];
。如何协调您的方法与这种方法?我看不出我怎么能有一个hotel
对象可用。对不起,但我应该在我原来的问题中提到这一点......
谢谢!我可以看到这是如何工作的。只有一个问题:如何根据您的方法调用numberOfRowsInSection
和cellForRowAtIndexPath
中的两种方法?我还是这个游戏的新手,所以你不得不原谅我的愚蠢!
最后一个问题只是为了澄清我的一些困惑:我是否需要在表格视图中手动声明theSelectedCityName
和theSelectedCity
?我希望不会!恐怕更愚蠢。
在您选择城市的 TableViewController 上,您将在 didSelectRowAtIndexPath
中实例化酒店 TableViewController。实例化hotels 控制器并将被选中的cityName 传递给它。这是您在我输出theSelectedCity
时使用的值以上是关于如何从字典输入中更改 UITableview 的数组内容?的主要内容,如果未能解决你的问题,请参考以下文章
如何更改从 NSFetchedResultsControler 填充的 UITableview 中部分的显示顺序?
在 UITableView 中过滤 NSMutableDictionary 数据