0

我尝试使用数组推送到 UIViewController:

self.cities=@[@"New York", @"Chicago", @"Los Angeles", @"Miami"];

然后在我的didSelectRowAtIndexPath

[self.navigationController pushViewController:NewYorkViewController animated:YES];

但现在数组中的所有项目都推送到NewYorkViewController. 我相信一个NSDictionary会工作

NSDictionary *cities=@[@{@"city":@"NewYork",@"viewController":NewYorkViewController}, @{@"city":@"Chicago",@"viewController":ChicagoViewController}, @{@"city":@"LosAngeles",@"viewController":LosAngelesViewController}, @{@"city":@"Miami",@"viewController":MiamiViewController}];

但是,我是菜鸟,从未与NSDictionary. 如果你能很好地解释我将如何做这件事。如果您知道使用数组的方法也可以。

附言。我不使用storyboards,你能否解释一下我会在我的cellForRowAtIndexPath: 和numberOfRowsInSection:中做什么

谢谢

4

3 回答 3

0

我现在使用的是Windows系统,所以下面的代码可能有错误。

使用反射获取IOS Class 然后使用this分配一个对象并进行操作

您可以使用[Object class]NSClassFromString ("Class Name")来获取类的类型

像这样:

NSString * ClassName = @ "yourClassName";
Class * tempClass = NSClassFromString (ClassName);
//if your class is subclass of UIViewController
UIViewController * tempObj = [[tempClass alloc] init];
//operating it
[self.navigationController pushViewController: tempObj animated:YES];
[tempObj release];

对于您的代码,您可以像这样更改它:

//NSDictionary =@{@"key",@"value",....}
NSDictionary *citieone=@{@"NewYork",[NewYorkViewController Class]}
NSDictionary *citietwo = @{@"Chicago",NSClassFromString(@"ChicagoViewController")};
//other citys
NSArray* cities = @{citieone,citietwo,...};
//in UITableView
NSString* cityName = [[[citis objectForIndex:index] allKeys] objectAtIndex:0];
Class* controllerClass = [[[citis objectForIndex:index] allValues] objectAtIndex:0];
 // operating it
 UIViewController * controller= [[controllerClass alloc] init];
[self.navigationController pushViewController: controller animated:YES];
[controller release];
于 2013-10-01T18:56:19.163 回答
0

我猜你想将数据从 UITableViewController 传输到 NewYorkViewController。通常的方法是在你的 NewYorkViewController 中有一个属性,比如一个数组或者你想要的任何东西。

@property (nonatomic,retain) NSMutableArray *itemsArray;

并在创建 NewYorkViewController 的对象时在 didSelectRowAtIndexPath 中

NewYorkViewController *newyorkObject = [NewYorkViewController alloc]init];
newyorkObject.itemsArray = self.cities;
[self.navigationController pushViewController:newyorkObject animated:YES];

并在 NewYorkViewController 的 viewDidLoad 中添加:

NSLog(@"items array: %@",self.itemsArray); //to check whether you got what you passed from the previous class.
于 2013-10-01T13:00:00.377 回答
0

我对我的应用程序做了类似的事情,但我使用的是 NSArray 而不是 NSDictionary,但逻辑是类似的恕我直言。

我用我的对象创建了一个 NSArray,并创建了一个方法来返回它们的计数以及索引处的名称。这样当我想从数组中获取特定对象时,我可以快速访问它。我已更改我的代码以接受 NSDictionary 以便您可以使用。

为了在 UITableView 中创建行数,我创建了一个在调用时返回行数的方法。

-(NSInteger) numberOfCities
{
    NSArray * allKeys = [mutableDictionary allKeys];
    return [allKeys count];
}

这将在

- (NSInteger) tableView: (UITableView*) tableView numberOfRowsInSection: (NSInteger) section
{
    return [self numberOfCities];
}

这样 UITableView 将具有与 NSDictionary 一样的确切行数

为了在特定索引处返回名称,以便您可以在 UITableViewCell 中显示该名称,我创建了此方法

-(NSString*) cityNameAtIndex: (NSInteger) index
{
    return NSString* cityName = [[[mutableDictionary objectForIndex:index] allKeys] objectAtIndex:index]; ;
}

这个方法可以在

- (UITableViewCell*) tableView: (UITableView*) tableView cellForRowAtIndexPath: (NSIndexPath*) indexPath

将不同的城市名称分配给表格中的不同单元格。

然后在委托

- (void) tableView: (UITableView*) tableView didSelectRowAtIndexPath: (NSIndexPath*) indexPath

您可以调用此方法并推送到不同的视图控制器

UIViewController* selectedController = nil ; 
NSString* nameOfCity = [self cityNameAtIndex: indexPath.row] ;

    if( [nameOfCity isEqualToString:@"New York"] )
        selectedController = [[NewYorkViewController alloc] init];
    else if( [nameOfCity isEqualToString:@"Chicago"] )
        selectedController = [[ChicagoViewController alloc] init];
    else if( [nameOfCity isEqualToString:@"Miami"] )
        selectedController = [[MiamiViewController alloc] init];
    else if( [nameOfCity isEqualToString:@"Los Angeles"] )
        selectedController = [[LosAngelesViewController alloc] init];

为此,您必须事先创建不同的视图控制器(芝加哥、纽约、洛杉矶、迈阿密),但如果您已经创建了它们并将它们作为对象留在 NSDictionary 中,则可以使用 nameOfCity 来获取NSDictionary 中属于该城市的 viewController 对象,然后将 selectedController 分配给该 viewController。

但是如果你只使用 NSDictionary 来存储城市的名称,我认为 NSArray 会是一个更好的选择。我在 appDelegate 中创建了我的,NSArray 中的名称在我的名为 global.h 的类中是 #define,因为我需要 NSArray 和许多不同视图控制器中的名称,所以如果你也需要它,你可以这样做。

希望这可以帮助!:)

于 2013-10-18T09:50:00.037 回答