UIButton не удалось вызвать функции? - PullRequest
0 голосов
/ 30 мая 2011

У меня есть viewcontroller (mainViewController) и класс представления (класс UIView, mainView).mainViewController, я вызвал метод «generateView» из класса mainView.Вот код:

Метод 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, потому что я хочу вызвать updateDataв mainViewController, но как бы я ни пытался, кнопка не вызывает функцию, которая должна быть вызвана.Есть идеи?

РЕДАКТИРОВАТЬ:

Вот как я назвал класс представления

- (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 голосов
/ 30 мая 2011

Попробуйте добавить этот код в ваш метод

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

Просьба изменить ваш код, чтобы избежать утечек памяти.Убедитесь, что вы удаляете объекты, владельцем которых вы являетесь.

0 голосов
/ 30 мая 2011

Попробуйте,

[b addTarget:mainViewController.view action:@selector(updateData:) forControlEvents:UIControlEventTouchUpInside];
0 голосов
/ 30 мая 2011

Вы должны установить delaysContentTouches на YES на UIScrollView.

У тебя тоже течет куча памяти. Убедитесь, что вы отпускаете объекты UIButton (b) и NSData (imageData), как только вы закончите с ними.

- РЕДАКТИРОВАТЬ: Я попробовал ваш код, и он отлично работает. Но, похоже, вы хотели весь этот код в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...