我有一个视图控制器。当我按下其中的按钮时,会出现一个带有uitableview的弹出控制器。我选择一行,显示另一个视图,其中包含一些控件。当我按下一个显示“保存项目”的按钮时,我希望它解除弹出窗口。我该怎么做?
这是我尝试过的:
使用委托和协议模式。这是没有用的,因为为了在我的tableview中推送另一个视图,整个事情必须嵌入导航视图控制器中,所以当我segue时,它会分离到一个导航控制器,而不是我可以设置popover委托的tableview对
将我的主视图添加为我想要忽略的视图的成员。我不知道为什么这不起作用。
答案 0 :(得分:1)
硬道路
故事中有四个视图控制器,还有一个弹出控制器。我将调用三个视图控制器“主视图控制器”,“nav”,“vcA”和“vcB”。据我了解,“nav”是popover的初始内容视图控制器,并以“vcA”作为其根视图控制器。
main view controller -> popover controller -> nav -> vcA -> (later) vcB
当您从主视图控制器显示弹出窗口时,您将保留对弹出控制器的引用。正如你所知,这就是解雇的可能原因。
创建“保存”按钮时,将其目标设为主视图控制器,并将其操作设置为主视图控制器中的方法。你必须在代码中设置它;它无法从故事板配置,因为您无法从一个场景到另一个场景形成一个动作。 (你可以这样做是因为你在最初配置弹出控制器时开始引用nav和vcA。因此你可以向vcA提交对自身的引用,即主视图控制器。如果需要,你可以传递这个引用从vcA链接到vcB,因为vcB被召唤并推送到导航堆栈。)
现在用户点击Save,你的主视图控制器的方法运行,它使用它对popover控制器的引用来告诉它解雇。
轻松肮脏的方式
所有这一切。主视图控制器注册NSNotification。 “保存”按钮发布了NSNotification。完成。 :)
中间道路
您可以使用popover segue在故事板中设置整个链,并通过主视图控制器中的展开方法匹配的Unwind segue进行解雇。我最初从未想过这个,因为我不喜欢popover segues。但它确实有效。
答案 1 :(得分:0)
这就是我解决问题的方法(抱歉英语不好):
首先,在VcA中创建UIStoryboardPopoverSegue
的属性,并从主视图控制器设置它。
导航 - > VcA_ViewController
@property (strong, nonatomic) UIStoryboardPopoverSegue *popupSegue;
然后,在主视图控制器prepareForSegue中设置属性:
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"your segue from the mainview to the navigation"]) {
UINavigationController *navigationController = (UINavigationController *)c;
VcA_ViewController *vcA = (VRPointOfInterestsFiltersViewController *) navigationController.topViewController;
vcA.popupSegue = (UIStoryboardPopoverSegue*)segue;
} }
现在,您可以从VcA控制器获得关闭按钮
- (IBAction)dismissPopoup:(id)sender {
[self.popupSegue.popoverController dismissPopoverAnimated:YES]; }
不要忘记将MainViewController中的popOverSegue链接到NavController。
希望它有所帮助!