【问题标题】:Parent view -> Subview -> button -> subview method父视图 -> 子视图 -> 按钮 -> 子视图方法
【发布时间】:2010-08-31 17:54:41
【问题描述】:

我有一个带有 ui 视图的父视图。这会在 viewdidload 上加载一个子视图控制器。 subviewcontroller 上有一个按钮,该按钮在 touch up 内部链接到一个名为 clicked 的 subviewcontroller 方法。

这会导致触发错误的访问错误并使应用程序崩溃。我的问题是,这种设置是否可行,还是我必须在父视图中使用该方法?子视图将在 8 个不同的父视图中加载,所以我想将方法​​保留在子视图中。

这样做的正确方法是什么?

【问题讨论】:

  • 我认为在崩溃前后发布相关代码是个好主意。
  • 方法运行时崩溃。该方法是空的,我想知道对此的最佳做法是什么,而不是特定于代码。谢谢
  • 任何设置都是可能的。崩溃是特定于代码的。
  • 我知道我已经花了将近两年的时间,但我也遇到了同样的问题。这让我发疯..你找到任何解决方案了吗?谢谢
  • 是的,关键是使用委托,因此 subview.delegate = parentview,请参阅下面的@VdesmedT 答案

标签: iphone objective-c xcode


【解决方案1】:

这种设置的好方法是有一个协议,包括点击消息,一个包含按钮的视图中的类型 id 的委托属性和一个在同一视图中触发委托消息的方法,如 [self.代表点击]。 TouchUpInside 事件链接到 IB 中的该方法,并且父视图将自己设置为子视图的委托,并使其自身符合协议。这听起来有点棘手,但它绝对是正确的做法。

协议

@protocol viewWithButtonDelegate
  -(void)buttonClicked:(UIButton*)button inView:(UIView*)view;
@end

在子视图界面中

@interface viewWithButton {
...
id<viewWithButtonDelegate> delegate;
}
...
@property (nonatomic, retain) id<viewWithButtonDelegate> delegate
-(void)buttonClicked:(id)sender;
...
@end

在子视图实现中

-(void)buttonClicked:(id)sender {
  if([sender class] == [UIButton class]) {
    [self.delegate buttonClicked:(UIButton*)sender inView:self]
  }
}

控制器接口是这样声明的

@interface myController<viewWithButtonDelegate>

最后在控制器实现中:

-(void)buttonClicked:(UIButton*)button inView:(UIView*)view {
  //do something in response to button clicked
}

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多