从 TableViewController 中关闭 ViewController
Posted
技术标签:
【中文标题】从 TableViewController 中关闭 ViewController【英文标题】:Dismiss ViewController from TableViewController 【发布时间】:2009-09-23 07:04:00 【问题描述】:我已经展示了 viewController,它包含一个导航控制器,它的视图是从另一个 nib 加载的,其中包含 UITableView。我想从 UITableViewController 中取消呈现的 viewController。我已经尝试了 self.parentViewController 和 self.navigationController 和 self.navigationController.parentViewController 的所有组合,但我仍然无法将其关闭。如何以及最好的方法是什么?
【问题讨论】:
【参考方案1】:我从来没有让self.navigationController.parentViewController
像宣传的那样工作,但这确实对我有用:
NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] myParentViewMethod:arg1 withArg2:arg2 ...];
【讨论】:
我无法让它工作,我在数组中只有一个项目并且仍然没有关闭视图。这可能与我创建它的方式有关。我用 XIB 添加了一个新的 UIViewController 并为 UINavigationController 创建了一个插座,然后我将它连接起来。接下来我用 XIB 创建一个 UITableViewController。回到 UIViewController 的 XIB,我将其设置为加载新的 nib 并将类设置为 UITableViewController 的类。【参考方案2】:this 不起作用吗?
[myViewController presentModalViewController:otherController animated:YES];
// ...
[myViewController dismissModalViewControllerAnimated:YES];
【讨论】:
我需要处理来自 UITableView 的数据,并在 UITableViewController 中执行此操作,我需要关闭 parentViewController,但这不起作用【参考方案3】:听起来你的等级制度有点让自己陷入困境,但没关系,我认为我们可以解决它。有两种“通常”的方法是:
-
从控制器A,呈现控制器B,从B做工作,从B解散,返回A
从控制器 A,呈现控制器 B,从 B 执行工作,通过委托协议向 A 提出事件,从 A 解除 B,将控制权返回给 A
在您当前的情况下,这可能需要大量的重构,在这种情况下,将句柄作为属性公开给另一个控制器可能更容易,只需确保它是一个弱引用,如下所示:
@interface ControllerB : UIViewController
ControllerA* controllerA;
@property (readwrite, nonatomic, assign) ControllerA* controllerA; // weak reference
@end
或者,无论你喜欢什么,关键是适当地确定变量的范围,以便在需要时可用。
【讨论】:
【参考方案4】:我刚刚结束了使用委托来解散父级。
【讨论】:
以上是关于从 TableViewController 中关闭 ViewController的主要内容,如果未能解决你的问题,请参考以下文章
FancyBox 从 iframe 中关闭并将父页面带到链接