iOS 如何控制 UIContainer View 的显示和消失?

Posted

技术标签:

【中文标题】iOS 如何控制 UIContainer View 的显示和消失?【英文标题】:iOS How to control the UIContainer View show and disappear? 【发布时间】:2015-03-03 02:22:23 【问题描述】:

我有一个UIViewController 和一个UIContainer 视图。

我想模拟UIAlertView的效果,但是不知道如何构建Container View 显示和隐藏的好方法。

我已将UITableView 放入我的UIContainer 视图中,我使用委托将所选项目发送到UIViewController(ParentViewController) 并显示在标签中。(与alertSegue 转义名称)

ParentViewController 中有一个显示按钮,我需要单击所选项目,它将关闭(隐藏/关闭?)UIContainer 视图。

现在UIContainer视图默认是隐藏的,故事板截图如下:

我的 ParentViewController.h

 @interface ViewController : UIViewController<ContainerViewBLETableDelegate>

 @property (weak, nonatomic) IBOutlet UIButton *btn;
 - (IBAction)btnAction:(id)sender;
 @property (weak, nonatomic) IBOutlet UILabel *lb;
 @property (weak, nonatomic) IBOutlet UIView *containerView;

 -(IBAction)unwindSegue:(UIStoryboardSegue *)segue;

 @end

.m 文件:

 - (void)viewDidLoad 
     [super viewDidLoad];
 

 - (IBAction)btnAction:(id)sender 
     _containerView.hidden = NO;

 

 -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 
     if( [segue.identifier isEqualToString:@"alertSegue"])
     
         ContainerViewBLETable *vc = segue.destinationViewController;
         vc.delegate = self;
     
 

 -(void) ContainerViewBLETable:(ContainerViewBLETable *)vc      andSelectedDone:(NSString *)selectedStr
 
     self.lb.text = selectedStr;
     vc.view.hidden = YES;
 

 -(IBAction)unwindSegue:(UIStoryboardSegue *)segue
 
 

容器视图控制器.h:

 @class ContainerViewBLETable;
 @protocol ContainerViewBLETableDelegate <NSObject>

 -(void) ContainerViewBLETable:(ContainerViewBLETable*)vc andSelectedDone:(NSString*)selectedStr;

 @end

 @interface ContainerViewBLETable :      UIViewController<UITableViewDataSource,UITableViewDelegate>

 @property(nonatomic,assign) id<ContainerViewBLETableDelegate>delegate;

 @property (weak, nonatomic) IBOutlet UITableView *tableVW;

 @end

UIContainerView .m 部分:

 .....
 -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 
    [self.delegate ContainerViewBLETable:self andSelectedDone:[NSString stringWithFormat:@"%ld",indexPath.row]];
 
 .....

虽然这段代码可以将值传递给UIViewController(ParentViewController),并且UIContainer视图被隐藏了,但是当我再次点击显示按钮时,它没有任何效果(我感觉容器视图是重叠导致触摸失效)。

(顺便说一句,我试过了

 [self.parentViewController dismissViewControllerAnimated:YES completion:nil];

没有效果)

问题:

如何使用委托隐藏容器视图并且可以再次触摸显示按钮显示容器?

还有什么好方法可以控制UIContainer 视图在ParentViewControllerUIContainerView 中显示和消失?

我真的很感谢大家,你们可以帮助我,而且比更好。

【问题讨论】:

所以当你在ContainerViewBLETable中选择containerView中的单元格时,它会推送到ParentViewController ,其中有一个标签显示show 当我在 containerView 中选择单元格时,我将隐藏 ContainerView,它会使用 delegate.the label 将值传递给 ParentViewController 在 parentviewcontroller 中显示。然后当我点击“显示按钮”时,我需要再次显示容器视图。 【参考方案1】:

containerViewshow button 位于不同的视图控制器中。所以你不能只是隐藏它。实现它的简单方法是当您选择containerView 中的单元格,呈现ParentViewControllerContainerViewController 中的视图将自动关闭。

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

   [self.delegate ContainerViewBLETable:self andSelectedDone:[NSString stringWithFormat:@"%ld",indexPath.row]];
   ParentViewController *vc = [[self storyboard] instantiateViewControllerWithIdentifier:@"ParentViewController"];
   [self presentViewController:vc animated:YES completion:nil];

要显示容器,您可以关闭显示的ParentViewController。 1.

- (IBAction)btnAction:(id)sender 

   [self.presentingViewController dismissModalViewControllerAnimated:YES];

或者 2.设置segue关闭viewController,使用prepareForSegue作为delegate与其他viewController通信。

REMOVE vc.view.hidden = YES 在您已实施的委托中

 -(void) ContainerViewBLETable:(ContainerViewBLETable *)vc andSelectedDone:(NSString *)selectedStr.

【讨论】:

我取消了隐藏的容器视图。但最初,容器视图是显示的,所以我添加了 [self.presentingViewControllerdismissViewControllerAnimated:NO completion:nil];在viewdidload中,情况还是一样。 parenetview 总是显示包括容器视图。如果可以的话,我已经在 github 上发布了这个项目。你可以检查一下效果。 :(github.com/dickfalaDeveloper/popalertShow非常感谢你。 是的,当单击按钮显示容器视图时,单击容器表单元格隐藏容器视图。这是我的目的。谢谢。 您已将 segue 嵌入到 containerViewBE 表,而不是 containerViewBE 控制器。你需要连接show buttoncontainerViewController之间的segue。我误解了你对 vc 层次结构的感觉。 didSelectRowAtIndexPath 方法应该调用 dismiss 而不是 present。对不起,我的错。 对不起~问题没有解决。我需要模拟 UIAlertView 效果,所以我使用容器视图。你能不能试着改变我的测试项目代码来达到效果?我混淆了更多时间:( @dickfala 你说的 UIAlertView 效果是什么?

以上是关于iOS 如何控制 UIContainer View 的显示和消失?的主要内容,如果未能解决你的问题,请参考以下文章

IOS SDK: Container view with 3 UI View area如何?

iOS 如何知道哪个视图控制器应该处于活动状态?

[ IOS ] iOS-控制器View的创建和生命周期

iOS swift:Deinit一个孩子View Controller

iOS之深入了解控制器View的加载

如何在 iOS 上正确使用 Container View Controller