使父视图控制器可以访问子视图中的 UIButton

Posted

技术标签:

【中文标题】使父视图控制器可以访问子视图中的 UIButton【英文标题】:Make UIButton within sub view accessible to parent viewcontroller 【发布时间】:2014-05-22 15:03:00 【问题描述】:

我的应用程序视图中有一个子视图,由本用户指南设置:

http://patientprogrammer.wordpress.com/2012/03/12/re-usable-subviews-in-ios/

我有一个 UIView,它是子视图 .xib 文件的文件所有者,它显示视图:

-(void)awakeFromNib


    [[NSBundle mainBundle] loadNibNamed:@"headerview" owner:self options:nil];
    [self addSubview:self.view_header];

现在这个子视图中有一个按钮,我需要点击它。是否可以从父视图 UIViewController 访问此按钮?

【问题讨论】:

为什么不让代表向上传递按钮单击事件? 当然,我只是在寻找一个可行的解决方案来传递点击事件,如果你有一个很棒的解决方案 【参考方案1】:

    首先在你的子视图 headerView (headerView.h) 中定义协议为:

    @protocol headerViewDelegate;
    
    @interface hearderView : UIView 
    @property (nonatomic,strong)IBAction UIButton * button1;
    @property (nonatomic, assign) id<headerViewDelegate> delegate;
    
    @end
    
    @protocol headerViewDelegate <NSObject>
    
    @optional
    
    -(void)didClickedButton1;
    
    @end
    

    .m文件中的按钮点击方法

    [self.delegate didClickedButton1];
    

    (这表示该视图的委托将执行此 didClickedButton1: 方法) (如果在头文件中符合这个协议,Viewcontroller 可以成为委托)

    现在,在父视图控制器中:

    一个。符合使用 headerViewDelegate 导入“标题视图” 放

    b.现在您可以将方法 didClickedButton1 放在父视图控制器中。 当您单击 button1 时会调用它。

     -(void) didClickedButton1
    
      //do your stuffs here
      
    

    当您单击子视图中的按钮时,会在父视图控制器中调用此方法,因为在父视图控制器中,我们说我是您的代表(子视图),我将完成您拥有的任务在您的协议中提到(这里是 -(void) didClickedButton1: method )。

【讨论】:

以上是关于使父视图控制器可以访问子视图中的 UIButton的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 在子视图控制器中不起作用

访问 UIButton 的子视图控件

UICollectionViewCell 中的 UIButton 子视图不更改控件状态

NSLayoutConstraint 后子视图中的 UIButton 未收到触摸

从子视图访问属性到 ViewController Swift

UIButton 作为复杂 UIScrollView 上的子视图