从 UITableViewCell 到 UITableView 到 UINavigationController 的引用

Posted

技术标签:

【中文标题】从 UITableViewCell 到 UITableView 到 UINavigationController 的引用【英文标题】:Reference from UITableViewCell to UITableView to UINavigationController 【发布时间】:2010-03-13 06:17:06 【问题描述】:

如果用户点击并按住 Foo 表格视图单元格 2 秒,则应显示模态视图。当新的 Foo 添加到单元格时,也会显示模态视图。模态视图的委托协议由父 UITableView 子类实现。

我的点按检测代码位于 Foo UITableViewCell 类中。

我在引用父 tableview 的导航控制器来显示模态视图时遇到了困难。

FooModalViewController *modalController = [[FooModalViewController alloc] initWithNibName:@"FooModalViewController" bundle:nil];
FooTableViewController *tableView = (FooTableViewController *) self.superview;
foo.delegate = tableView;

看起来没问题,但我在引用包含 tableview 的导航控制器时遇到问题。下面的代码构建正常但抛出异常 - NSOBject DoesNotRecognizeSelector。

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:modalController];
[[tableView.navigationController] presentModalViewController:navigationController animated:YES];

我认为也许我的设计有缺陷..?

【问题讨论】:

【参考方案1】:

这样做的正确方法是给单元格一个委托协议(例如,- (void)buttonPressedInCell:(UITableViewCell*)cell),并在按下按钮时使用它来通知控制器。然后,将引用导航控制器的控制器可以做适当的事情。

【讨论】:

这似乎是最好的方法,但是我最终以不同的方式实现了它。我将 parentNavigation/parentTableView 属性添加到 UITableViewCell 子类。这些是由单元格的 tableView 控制器设置的,即 parentTableView。我将模态控制器的委托设置为parentTableView引用的对象,并用parentNavigation引用的对象显示新的模态视图。似乎工作正常。【参考方案2】:

表格视图单元格对象的父视图只是一个 UITableView。它永远不会是一个表视图控制器(FooTableViewController)——事实上,没有标准的方法可以仅从视图中找到视图控制器。

您可以尝试使用tableView.delegate 来获取视图控制器,因为表视图控制器是其表视图的委托。

[tableView.delegate presentModalViewController:navigationController animated:YES];

假设您的导航控制器已连接到您也可以使用的应用代理

YourAppDelegate* del = [UIApplication sharedApplication].delegate;
[del.navCtrler.visibleViewController
    presentModalViewController:navigationController animated:YES];

【讨论】:

以上是关于从 UITableViewCell 到 UITableView 到 UINavigationController 的引用的主要内容,如果未能解决你的问题,请参考以下文章

在 UiTableViewCell 上设置时,DisclosureButton Indicator 或任何类型的附件类型似乎都没有出现

uitableviewcell 中的自动布局问题

如何在 UITableViewCell 中添加多行文本字段?

当附件是UITableViewCellAccessoryCheckmark时,如何将文本置于UITableViewCell中

自定义 UITableViewCell 创建了两次......让我发疯

UITableViewCell 使用 separatorInset 隐藏分隔符在 iOS 11 中失败