如何使用NSDictionary从UITableViewController推送到UIViewController?

时间:2013-10-01 12:50:44

标签: ios objective-c uiviewcontroller uitableview nsdictionary

我尝试使用数组推送到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合作过。如果你愿意解释我将如何做到这一点。如果你知道使用数组的方法也可以。

PS。 我不使用storyboards,您是否也可以解释一下我在cellForRowAtIndexPathnumberOfRowsInSection中会做些什么:

由于

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

我现在正在使用Windows系统,因此以下代码可能包含错误。

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

您可以使用 [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];

答案 2 :(得分: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

您可以调用此方法并推送到不同的viewControllers

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];

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

但如果您只使用NSDictionary来存储城市的名称,我认为NSArray将是更好的选择。我在appDelegate中创建了我的,NSArray中的名字在我的类名为global.h的#define中,因为我需要NSArray并在许多不同的viewControllers中命名,所以如果你也需要它,你也可以这样做。

希望这有帮助! :)