我尝试使用数组推送到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
,您是否也可以解释一下我在cellForRowAtIndexPath
和numberOfRowsInSection
中会做些什么:
由于
答案 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中命名,所以如果你也需要它,你也可以这样做。
希望这有帮助! :)