关于 iphone:从自定义 UITableViewCell 中调用模式窗口

Calling a modal window from within a custom UITableViewCell

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

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

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

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

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

我尝试了以下方法,但得到了 NSInvalidArgumentException -[ItemCellController navigationController]: unrecognized selector sent to instance error。

1
2
3
4
5
6
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 中调用模式窗口。

谢谢


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

有几种方法:

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

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

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

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

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

从根控制器中调用的示例监听代码:

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

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

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

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


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