从自定义UITableViewCell中调用模态窗口

时间:2009-08-12 18:04:34

标签: iphone uitableview uinavigationcontroller model-view-controller

我有一个UITableView,在其中我以下面的方式创建一个自定义UITableViewCell:

ItemCellController *cell = (ItemCellController *)[tableView dequeueReusableCellWithIdentifier:ContentListsCellIdentifier];
...
cell = [[[ItemCellController alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ContentListsCellIdentifier] autorelease];

我这样做可以获得touchesBegan和touchesEnded事件(这样我就可以实现长时间的触摸)。使用NSLog我可以看到使用以下代码从touchesBegan方法中正确调用longTouch:

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(longTouch:) userInfo:nil repeats:YES];

问题是我无法从longTouch方法中调用模态窗口。

我尝试了以下内容,但是我得到了一个N​​SInvalidArgumentException - [ItemCellController navigationController]:发送到实例错误的无法识别的选择器。

AddItemController *addView = [[AddItemController alloc] initWithNibName:@"AddItemView" bundle:nil];  

UINavigationController *controller = [[UINavigationController alloc] initWithRootViewController:addView];
controller.navigationBar.barStyle = UIBarStyleBlack;
[[self navigationController] presentModalViewController:controller animated:YES];
[controller release];

所以问题是,如何在自定义UITableViewCell中调用模态窗口。

由于

2 个答案:

答案 0 :(得分:13)

navigationController s存在UIViewController属性,但UITableViewCell(我猜ItemCellController是其子类)不是UIViewController,所以它默认情况下没有该属性。

有一些appraoches:

(1)将UIViewController*属性(可能称之为controller)添加到自定义单元格类型,并使用init方法传递指向控制器的指针(例如initWithController: )。然后在你的单元格中,你可以执行:

UINavigationController* navController = [ /* alloc and init it */ ]
[self.controller presentModalViewController:navController animated:YES];

(2)您的app委托对象可以拥有一个控制器属性,您可以从代码中的任何位置访问该属性。然后你可以做这样的事情:

MyAppDelegate* myAppDelegate = [[UIApplication sharedApplication] delegate];
[myAppDelegate.controller presentModalViewController:navController
                                            animated:YES];

(3)这个不那么直接但更灵活。您可以设置根控制器(您想要显示模态视图的控制器)来监听某个通知,并从表格单元格中发布该通知。

示例侦听代码,从根控制器中调用:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(showModal:)
                                             name:@"show modal"
                                           object:nil];

从表格单元格中调用的示例邮政编码:

NSDictionary* userInfo = [ /* store a handle to your modal controller */ ];
[[NSNotificationCenter defaultCenter] postNotificationName:@"show modal"
                                                    object:self
                                                  userInfo:userInfo];

根控制器的showModal:方法将使用userInfo中包含的NSNotification来确定要以模态方式呈现的视图控制器。这是更多的工作,但它会自动允许你的任何代码在任何地方呈现模态视图,而不会让他们完全访问根控制器指针。

答案 1 :(得分:0)

它看起来不像你在任何地方设置单元格导航控制器,似乎它不喜欢[[self navigationController] presentModalViewController:controller animated:YES];该行,检查该“self”对象的nagivationController属性