需要从iOS中的tableView选择中动态创建ViewController对象

时间:2012-12-13 18:43:58

标签: ios for-loop uiviewcontroller nsmutablearray nsmutabledictionary

我的iOS应用程序中有一个UIViewController,显示一个派生自NSMutableArray的表。此表中的单元格均指向用户进行选择时调用的唯一UIViewController。我在“didSelectRowAtIndexPath:”方法中尝试做的是通过UIViewController动态创建NSMutableDictionary,其中包含与表格所在的NSMutableArray中的值匹配的键,以及包含需要调用的相应UIViewController的相应类名的值。因为列表很长,我想我需要使用for循环来做这个,但是我对如何做这个有点困惑。我的NSMutableDictionary看起来像这样:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setObject:@"aViewController" forKey:@"SelectionA"];
    [dict setObject:@"bViewController" forKey:@"SelectionB"];
    [dict setObject:@"cViewController" forKey:@"SelectionC"];

我的NSMutableArray是我的TableView的基础,如下所示:

NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects:@"SelectionA", @"SelectionB", @"SelectionC",...,nil];

如何获取对单元格内部值的引用,然后构造一个for循环,该循环将动态创建与tableView中用户所做的选择相对应的正确viewController,然后将用户带到该viewController通过navigationController?

感谢所有回复的人。

3 个答案:

答案 0 :(得分:2)

创建许多ViewControllers不是一个好主意,你应该创建一个ViewController, 并将tableCell的值传递给它。换句话说,通过选择单元格来更改ViewController的数据模式。但是你将呈现相同的ViewController。

只有当你的单元格被核心化为不同类型(例如一个单元格为道路毛,另一个单元格为文本值)时,你必须调用不同的ViewControllers。

如果您真的需要不同的视图控制器,那么从单元格数据中获取您想要显示的类型

didSelectCellRowAtIndexPath

中的

myAppDelegate *appDelegate = 
    [[UIApplication sharedApplication] delegate];

UIViewController *viewControllerToDisplay;
switch (selection.type) {
  case MapType:  
      viewControllerToDisplay = appDelegate.mapViewController;
  case Picture:
      viewControllerToDisplay = appDelegate.pictureViewController;

}

现在将viewControllerToDisplay推送到navigaton Controller。

答案 1 :(得分:0)

如果确实需要每个单元格的视图控制器,则无需使用字典查找它们。由于选择将通过索引路径进行,因此数组是更好的选择。

创建一个具有两个属性的自定义对象:要在单元格中显示的名称,以及指向要在其选中时推送的视图控制器的指针。使用这些对象而不是字符串加载myArray。填充单元格时,选择与该行匹配的对象并使用其名称。轻触单元格时,选择与该行匹配的对象并按下其控制器。

(但是,正如其他人所说,如果你可以使用相同的控制器而只改变数据,那就是要走的路!)

答案 2 :(得分:0)

这是解决方案, 如果您知道类的名称,则将所有类名存储在数组中,其中包含具有键ClassName和Xib的字典。我更喜欢plist来存储名字,但你也可以使用其他方式。

选择表格或选择器中放置代码,

Class classobject = NSClassFromString([[ClassArray   objectAtIndex:row]valueForKey:@"ClassName"]);

id object = [[classobject alloc] initWithNibName:[[ClassArray objectAtIndex:row]valueForKey:@"Xib"] bundle:nil];

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

第一行会将您的字符串转换为类。 现在我们有一个好处,即id可以保存任何对象,因此使用id创建对象。最后你有一个自定义类对象,你可以做任何你想做的事情,这里只是我做导航的演示。