如何调用子UIView中的方法?

时间:2010-09-20 21:17:27

标签: iphone uiview methods

我有一个名为MainViewController的uiviewcontroller, 我在viewdidload事件中添加了一个子视图(名称:DetailView)。 当我按下mainviewController中的a按钮时,我想调用子视图中的方法writeSomething。 // DetailView是UIView的子类。

Mainviewcontroller中的

    - (void)viewDidLoad {
    [super viewDidLoad];
    NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"DetailView" owner:self options:nil];
    UIView *aView= [nibViews objectAtIndex:0];
    aView.tag=100;
    self.detailView=aView;
    [detailContainer addSubview:self.detailView];


    }

-(void) writeAnythingInSubViewsLabel{
//i tried to reach detail UIView
 NSArray* subviews = [NSArray arrayWithArray: detailContainer.subviews];
 for (UIView *xView in subviews) {
  if ([xView isKindOfClass:[UIView class]]  && xView.tag==100) {
   NSLog(@"%@", xView);
   [xView writeSomething:@"hello"];
   break;
  }
 }
}
在DetailView中

-(void) writeSomething:(NSString *)anyText{
NSLog(@"%@", anyText);
}

但它给出了错误; [UIView writeSomething]:无法识别的选择器发送到实例.... 它在构建之前也会发出警告,UIView可能不会回复writeSomething ...... 我知道UIView和DetailView不匹配。这就是为什么它会发出警告。 我也试过for (DetailView *xView in subviews) { 但它永远不会在循环中找到标记。

我希望有人帮助我...... 编辑: DetailView.m

#import "DetailView.h"


@implementation DetailView
@synthesize image, button, label;
@synthesize delegate;

- (void)dealloc {
    [image release];
    [button release];
    [label release];
    [super dealloc];
}


- (id) initWithCoder: (NSCoder *) decoder {
    return self;
}


- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // Initialization code
    }
    return self;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

-(IBAction) backButtonPressed:(id) sender{
    [delegate hideDetailView];

}

-(void) writeSomething:(NSString *)anyText{
    NSLog(@"%@", anyText);
}

@end

3 个答案:

答案 0 :(得分:0)

尝试[detailContainer viewWithTag:100]

答案 1 :(得分:0)

不确定问题是什么,但为什么不将创建的视图保存在成员中? 通过这种方式,您无需重新搜索即可访问它。

答案 2 :(得分:0)

您似乎正在创建一个UIView而不是DetailView。

因此,它没有找到你在DetailView中创建的方法,因为它认为xView实际上是一个UIView - 它没有writeSomething方法。

您应该返回标题,导入DetailView.h文件,并确保detailView实际上是DetailView类型的对象,而不是UIView。

在viewDidLoad中,而不是

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"DetailView" owner:self options:nil];
UIView *aView= [nibViews objectAtIndex:0];
aView.tag=100;
self.detailView=aView;

尝试使用:

self.detailView = [[DetailView alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];

然后,您可以简单地使用:

而不是.m文件中的循环等
[self.detailView writeSomething:@"words"];
祝你好运!