在容器视图中选择表格单元格时与父视图控制器交互

时间:2015-05-13 09:05:09

标签: ios objective-c

我遇到这个问题,当我点击右边最后一个VC的表格单元格时,我想隐藏父VC的容器视图。

enter image description here

我尝试连接协议代理,但它没有用。

这是我失败的尝试:

  1. 我在GOCategoryMenuViewController上添加了协议。

    @protocol GOCategoryMenuViewControllerDelegate <NSObject>
    -(void)hideMenu;
    @end
    @interface GOCategoryMenuViewController : UIViewController
    @property(weak, nonatomic) id <GOCategoryMenuViewControllerDelegate> delegate;
    @end
    
  2. 在.m文件中实现hideMenu

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [self.delegate hideMenu];
    }
    
  3. 将标头和委托导入parentVC

    #import "GOCategoryMenuViewController.h"
    @interface ViewController : UIViewController<GOCategoryMenuViewControllerDelegate>
    
  4. 在ParentVC的.m中实现hideMenu

    -(void)hideMenu
    {
        NSLog(@"Hide the menu");
    }
    
  5. 我相信我还需要在代表身上宣布自我,但我不知道我是如何尝试在网上搜索解决方案无济于事的。这就是为什么我现在直接问你们所有人。请帮助和谢谢!

2 个答案:

答案 0 :(得分:0)

如果只想使用委托来解决它,则必须将父视图控制器控件委托传递给子视图控制器,并在子视图控制器中声明与父控件具有相同类型的属性。
然后,您可以在子视图控制器中对父视图的控件执行任何操作。

ParentViewController.h类

@interface ParentViewController : UIViewController
{
    NSMutableDictionary *dictOfPeople;
}

@property(nonatomic, retain) NSMutableDictionary *dictOfPeople;

ParentViewController.m类

@synthesize dictOfPeople;

- (void)anyMethod
{
    //initialize child view controller
    ChildViewController *childViewController = [[ChildViewController alloc] init];
    // here is important
    childViewController.owner = self; 
}

ChildViewController.h类

@interface ChildViewController : UIViewController
{
    id owner;
}

@property(nonatomic, assign) id owner;

ChildViewController.m类

@synthesize owner;

- (void)anyMethod
{
   // You can access parent view controllers dictOfPeople dictionary like this
   int totalNum = [((ParentViewController *)self.owner).dictOfPeople count];

   //...
}

答案 1 :(得分:0)

你的协议是真的,你唯一需要做的就是当你初始化GOCategoryMenuViewController的实例时,你应该给它一个代表......这样:

GOCategoryMenuViewController *category = [[GOCategoryMenuViewController alloc] init];
//if you don't give delegate, never your delegate method will get called
category.delegate = self;

您必须委托您的GOCategoryMenuViewController类的实例。