UIButton无法调用函数?

时间:2011-05-30 04:52:28

标签: iphone function uibutton

我有一个viewcontroller(mainViewController)和视图类(UIView类,mainView)。 mainViewController,我从mainView类调用了一个方法“generateView”。这是代码:

方法1:

- (void) generateView {
    container = [[UIScrollView alloc] initWithFrame: CGRectMake(10, 10, 500, 300)];
    container.backgroundColor = [UIColor clearColor];
    container.contentSize = CGSizeMake(500,1200);
    container.showsVerticalScrollIndicator = YES;
    [container setScrollEnabled:TRUE];
    container.backgroundColor = [UIColor redColor];
    int row = 0;
    int col = 0;
    for (int i = 0; i < 5; i++) {
        if(i % 4 == 0 && i != 0){
            row++;
            col = 0;
        }
        UIButton *b = [[UIButton alloc] initWithFrame: CGRectMake(col*120, row*120, 100, 100)];
        NSData *imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:[NSString stringWithFormat:@"%@/images/items/%i.png", HOSTADDR, i ]]];
        [b setBackgroundImage:[UIImage imageWithData:imageData] forState:UIControlStateNormal];
        [b setBackgroundColor: [UIColor colorWithRed:0x42/255.0f green:0x30/255.0f blue:0x27/255.0f alpha:1]];
        [b setTag: i];
        [b addTarget:self action:@selector(testFunction:) forControlEvents:UIControlEventTouchUpInside];
        [b setEnabled:TRUE];
        [b setUserInteractionEnabled:TRUE];
        [container addSubview:b];
        col++;
    }
    [self addSubview:container];
}


- (void) testFunction: (id) sender {
    NSLog(@"Function called. Sender tag number: %i", [sender tag]);
}

方法2:

- (void) generateView {
    container = [[UIScrollView alloc] initWithFrame: CGRectMake(10, 10, 500, 300)];
    container.backgroundColor = [UIColor clearColor];
    container.contentSize = CGSizeMake(500,1200);
    container.showsVerticalScrollIndicator = YES;
    [container setScrollEnabled:TRUE];
    container.backgroundColor = [UIColor redColor];
    int row = 0;
    int col = 0;
    for (int i = 0; i < 5; i++) {
        if(i % 4 == 0 && i != 0){
            row++;
            col = 0;
        }
        UIButton *b = [[UIButton alloc] initWithFrame: CGRectMake(col*120, row*120, 100, 100)];
        NSData *imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:[NSString stringWithFormat:@"%@/images/items/%i.png", HOSTADDR, i ]]];
        [b setBackgroundImage:[UIImage imageWithData:imageData] forState:UIControlStateNormal];
        [b setBackgroundColor: [UIColor colorWithRed:0x42/255.0f green:0x30/255.0f blue:0x27/255.0f alpha:1]];
        [b setTag: i];
        [b addTarget:mainViewController action:@selector(updateData:) forControlEvents:UIControlEventTouchUpInside];
        [b setEnabled:TRUE];
        [b setUserInteractionEnabled:TRUE];
        [container addSubview:b];
        col++;
    }
    [self addSubview:container];
}

我真正需要的是方法2,因为我想在mainViewController中调用updateData,但不管我怎么试,按钮都没有调用应该被调用的函数。有什么想法吗?

编辑:

这就是我调用视图类的方法

- (void) loadContent: (id) sender {
    [self removeSubmenus];
    switch ([sender tag]) {
        case 2001:
        {
            MainView *mainView = [[MainView alloc] initWithSubmenu:CGRectMake(420, 85, 0, 0)];
            [self.view addSubview:mainView];

            break;
    }   
    default:
        break;
}

}

3 个答案:

答案 0 :(得分:0)

您应该在delaysContentTouches上将YES设置为UIScrollView

你也在泄漏一堆记忆。确保在完成后同时发布UIButtonb)和NSDataimageData)个对象。

- 编辑:我尝试了你的代码,它工作正常。但似乎你想在UIView中使用所有这些代码,所以我把一个快速的样本汇总在一起。

TestView.h

#import <UIKit/UIKit.h>

@interface TestView : UIView {}

@end

TestView.m

#import "TestView.h"

@implementation TestView

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {

        UIScrollView *container = [[UIScrollView alloc] initWithFrame: CGRectMake(10, 10, 500, 300)];
        int row = 0;
        int col = 0;
        for (int i = 0; i < 5; i++) {
            if(i % 4 == 0 && i != 0){
                row++;
                col = 0;
            }
            UIButton *b = [[UIButton alloc] initWithFrame: CGRectMake(col*120, row*120, 100, 100)];

            [b setBackgroundColor: [UIColor colorWithRed:0x42/255.0f green:0x30/255.0f blue:0x27/255.0f alpha:1]];
            [b setTag: i];
            [b addTarget:self action:@selector(testFunction:) forControlEvents:UIControlEventTouchUpInside];
            [container addSubview:b];
            [b release];
            col++;
        }
        [self addSubview:container];

    }
    return self;
}

- (void) testFunction: (id) sender {
    NSLog(@"Function called. Sender tag number: %i", [sender tag]);
}

- (void)dealloc {
    [super dealloc];
}

@end

TestController.h

@interface TestController : UIViewController { }
@end

TestController.m:

#import "TestController.h"
#import "TestView.h"
@implementation TestController

- (void) generateView {
    TestView *tv = [[TestView alloc]initWithFrame:[self.view frame]];
    [self.view addSubview:tv];
    [tv release];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self generateView];
}

- (void)dealloc {
    [super dealloc];
}

@end

答案 1 :(得分:0)

尝试将此代码添加到您的方法

container.delaysContentTouches = NO;
container.canCancelContentTouches = NO;

请修改您的代码以避免内存泄漏。确保删除您拥有的对象。

答案 2 :(得分:0)

试试这个,

[b addTarget:mainViewController.view action:@selector(updateData:) forControlEvents:UIControlEventTouchUpInside];