如何从字典输入中更改 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 对象可用。对不起,但我应该在我原来的问题中提到这一点...... 谢谢!我可以看到这是如何工作的。只有一个问题:如何根据您的方法调用numberOfRowsInSectioncellForRowAtIndexPath 中的两种方法?我还是这个游戏的新手,所以你不得不原谅我的愚蠢! 最后一个问题只是为了澄清我的一些困惑:我是否需要在表格视图中手动声明theSelectedCityNametheSelectedCity?我希望不会!恐怕更愚蠢。 在您选择城市的 TableViewController 上,您将在 didSelectRowAtIndexPath 中实例化酒店 TableViewController。实例化hotels 控制器并将被选中的cityName 传递给它。这是您在我输出theSelectedCity 时使用的值

以上是关于如何从字典输入中更改 UITableview 的数组内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改从 NSFetchedResultsControler 填充的 UITableview 中部分的显示顺序?

在 UITableView 中过滤 NSMutableDictionary 数据

使用字典数据填充 UITableView (Swift)

UIKeyboard 可见时如何更改 UITableView 的大小?

如何从颜色字典中快速更改图像中的像素?

如何将图像从 plist 加载到 UITableView?