删除子视图并将控制权发回

Posted

技术标签:

【中文标题】删除子视图并将控制权发回【英文标题】:Remove subview and send control back 【发布时间】:2015-01-27 04:51:34 【问题描述】:

我正在使用以下代码从UIViewController 调用“HelpviewController”,它工作正常。

self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"InnerHelpPageViewController"];
            self.pageViewController.dataSource = self;

            InnerHelpViewController *startingViewController = [self viewControllerAtIndex:0];
            NSArray *viewControllers = @[startingViewController];
            [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

            // Change the size of page view controller
            self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30);

            [self addChildViewController:_pageViewController];
            [self.view addSubview:_pageViewController.view];
            [self.pageViewController didMoveToParentViewController:self];

在我的新控制器InnerHelpViewController 中,我已经完成了按钮,该按钮应该删除这个新添加的视图并将控制权发送回初始页面。

- (IBAction)unwindToMenuFromInnerHelp:(id)sender 
    [self.view removeFromSuperview];

此调用删除新添加的视图,但问题是“MenuController”被冻结。我无法点击它。有什么帮助吗?

解释流程-->我有一个菜单屏幕,其中一个名为“帮助”的按钮-->当用户单击此帮助按钮时,此问题中的代码的第一个 sn-p 将执行并显示 HelpViewController-->完成后帮助,用户点击“完成”按钮-->这应该关闭 HelpViewController 并移动到“菜单”屏幕。

【问题讨论】:

不要做 [self.view removeFromSuperview]; .它很丑。使用代表是的反向引用策略来删除视图。 @Tirth:感谢您的评论!你能帮我提供一个关于如何在这种情况下使用代表的参考吗?我找不到该案例的任何示例。 【参考方案1】:

在InnerHelpViewController.h文件类中实现协议方法

@protocol InnerHelpViewControllerDelegate

  -(void)removeCustomView;
@end

@interface InnerHelpViewController : UIViewController


@property(nonatomic, weak) id<InnerHelpViewControllerDelegate> delegate.

在 InnerHelpViewController.m 文件中

@synthesize delegate;

- (IBAction)unwindToMenuFromInnerHelp:(id)sender 
    [delegate removeCustomView];

在 MenuController .h 文件中采用 InnerHelpViewControllerDelegate。

@interface MenuController : UIViewController<InnerHelpViewControllerDelegate>


现在在创建 helpviewcontroller 对象时在 MenuController.m 文件中确认您的委托。

self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"InnerHelpPageViewController"];
            self.pageViewController.dataSource = self;

            InnerHelpViewController *startingViewController = [self viewControllerAtIndex:0];
            startingViewController.delegate = self;
            NSArray *viewControllers = @[startingViewController];
            [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

            // Change the size of page view controller
            self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30);

            [self addChildViewController:_pageViewController];
            [self.view addSubview:_pageViewController.view];
            [self.pageViewController didMoveToParentViewController:self];

//Implement here delegate method
     -(void)removeCustomView
      [self.pageViewController removeFromSuperview]
    

【讨论】:

谢谢!让我试试这个。 似乎委托未绑定到 InnerPageViewController 中的所有页面。仅在“第一页”按钮上调用代表。当我移动到下一页时,“unwind..”方法被调用但“delegate”方法没有被调用。有什么建议吗? Delegate 是一对一的映射,因此它在 pagecontroller 的 childviewcontrollers 中不起作用,因此您必须将委托对象分配给 pagecontroller 类的父级。如需详细了解,您必须阅读此alexefish.com/post/522641eb31fa2a0015000002 和developer.apple.com/library/ios/documentation/General/… 谢谢 谢谢!将通过这些链接。

以上是关于删除子视图并将控制权发回的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式从其父视图中删除子视图并将其附加到其他父视图

如何删除 UITableViewCell NSIBPrototypingLayoutConstraint 并将我自己的添加到子视图?

删除子视图和视图控制器?

如何在 iOS 中检索数据并将数据传递给标签栏控制器的子视图?

如何在firebase(swift)中获取子节点的值,并将其显示在视图控制器的标签中

切换选项卡时删除所有子视图控制器并移至父视图控制器 IOS 目标 c