xCode:从动态添加的子视图中激活 IBAction

Posted

技术标签:

【中文标题】xCode:从动态添加的子视图中激活 IBAction【英文标题】:xCode: Activating an IBAction from within a dynamically added subview 【发布时间】:2012-10-13 13:37:00 【问题描述】:

我有一个单独的 UIView 类,它构造一个包含 UIButton 的简单页脚栏。

  - (id)initWithFrame:(CGRect)frame
  
    self = [super initWithFrame:CGRectMake(0, 410, 320, 50)];
    if (self) 
      int buttonHeight = self.frame.size.height;
      int buttonWidth = 70;
      int nextBtnPosX =0;
      int nextBtnPosY =0;


      self.backgroundColor =[UIColor colorWithRed:254.0/255.0 green:193.0/255.0 blue:32.0/255.0 alpha:1.0];
      [self sendSubviewToBack:self];
      UIButton *nextBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
      [nextBtn setTitle:@"Next" forState:UIControlStateNormal];
      nextBtn.frame = CGRectMake(nextBtnPosX, nextBtnPosY, buttonWidth, buttonHeight);
      [nextBtn addTarget:self.superview action:@selector(GoToNextPage) forControlEvents:UIControlEventTouchUpInside];   

      [self addSubview:nextBtn];

    
    return self;
  

我有几个 ViewController,然后将上面的页脚视图类作为子视图添加到每个视图中。

  UIView *newFooter = [[theFooter alloc] init];
  [self.view addSubview:newFooter];

现在,页脚视图中的实际 UIButton 需要为其添加的每个 viewController 设置不同的标签。

所以我认为最好将 IBAction 添加到实际的视图控制器,然后通过页脚视图调用它。

但这就是我遇到问题的地方。如何从 addTarget 的页脚子视图中调用父控制器来初始化 IBAction(GoToNextPage)?

将它全部放在页脚子视图中并传入所需的目标是否会更容易,如果是这样,该怎么做。

【问题讨论】:

我已经设法通过在操作部分添加这行代码来防止应用程序表单崩溃 [nextBtn addTarget:self.superview action... 但这可能意味着它到达某个地方但只是不调用我的父视图中的 IBAction... 我建议对这种事情使用委托... 感谢您的反馈,对此方法有任何建议 【参考方案1】:

这里是您应该做什么的粗略概述。 你的 UIView 的头文件应该是这样的

@protocol myViewControllerDelegate <NSObject>
@optional
- (void)didPushButton:(id)sender;
@end

@interface UIViewController : UITableViewController

    __unsafe_unretained id <myViewControllerDelegate> delegate;


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

@end

记得在你的主文件中@synthesize delegate;

最后,在您的主文件中,您将拥有一个接收 UIButton 操作的 IBAction。 假设该动作名为 buttonPushed。

将该操作设置为:

- (IBAction)buttonPushed:(id)sender

    if (delegate)
        [delegate didPushButton:sender];

最后记住,你需要为你正在使用这个 viewController 的每个 viewController 设置委托。

UIView *newFooter = [[theFooter alloc] init];
[self.view addSubview:newFooter];
newFooter.delegate = self;

【讨论】:

以上是关于xCode:从动态添加的子视图中激活 IBAction的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 7 beta 5、Swift 2:UITableViewCell 的子视图在运行时未添加到 contentView

滚动视图只显示最后一个动态添加的子视图

Segue 不适用于动态添加的子视图

在导航控制器 xcode 中添加“子”视图

如何在 XCODE 中将 UIView 水平分成三个大小均匀的子视图?

带有 iOS 7 的 Xcode 5 中的 NSInternalInconsistencyException:“故事板:容器视图中有意外的子视图。”