UIButton addTarget не вызывает селектор - PullRequest
2 голосов
/ 30 октября 2011

Позвольте мне сначала заявить, что это не вопрос правильного выбора имени моего селектора, ни установки целевого значения кнопки в loadView, ни каких-либо других предложений, которые я видел за последние 4 часа просмотра.Я должен также объяснить, что я не использую ни перья, ни IB.

Эти кнопки работали на большую часть разработки.
Тогда пуф!Это не только кнопки.Мои таблицы не прокручиваются.Нажатие на ячейки в табличных представлениях не вызывает действия, которые я настроил.

Кажется, я полностью разорвал цепочку респондента;или что-то в этом роде.
Чтобы попытаться сузить источник проблемы созданного проекта на основе окон;убрал все, что генерирует xCode;удалил перо;и скопировал несколькими способами из моего исходного приложения делегата и моего rootViewController.

Это RVT, который содержит подвид, который содержит кнопки.Довольно просто.Тот же эффект.Я буквально удалил весь функциональный код, но следующий источник в appDelegate.m:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UIApplication sharedApplication] setDelegate:self];
    if(window == nil)
        window = [[UIWindow alloc] init];

    window.autoresizesSubviews = YES;

    if(controller == nil)
        controller = [[Controller alloc] init];

    window.rootViewController = controller;
    [window makeKeyAndVisible];
    return YES;
}

-(void)dealloc {
    [window release];
    [controller release];
    [super dealloc];
}

А в Controller:

- (void)buttonResponse {
    NSLog(@"Button touched up inside!!!!!");
}


- (void)loadView {
    [super loadView];
//test
    button = [UIButton buttonWithType:UIButtonTypeCustom];

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Button" ofType:@"png"]; 
    UIImage *image = [UIImage imageWithContentsOfFile:filePath];
    CGSize imageSize = [image size];

    CGRect buttonFrame = CGRectMake(0,0,imageSize.width + 100, BUTTONBAR_H + 100);
    button.frame = buttonFrame;
    [button setImage:image forState:UIControlStateNormal];

    button.backgroundColor = [UIColor blueColor];
    [button setTitle:@"" forState:UIControlStateNormal];

    button.userInteractionEnabled = YES;

    [button addTarget:self action:@selector(buttonResponse) forControlEvents: UIControlEventTouchUpInside];
    UIView *view = self.view;
    CGRect viewFrame = view.frame; //self.view is valid and takes up available screen
    [self.view addSubview:button];
    [self.view bringSubviewToFront:button];
//end test

    [self.view setNeedsDisplay];
}

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

Я знаю, что это должно быть что-то действительно простое.Но я не вижу этого.Я бы предпочел оставить свои волосы на месте.Мне интересно, произойдет ли это, когда я продолжу изучать причуды.

1 Ответ

1 голос
/ 30 октября 2011

Когда-нибудь звонят loadView?Поместите NSLog (или точку останова) в loadView, как проверку работоспособности.

Также, из UIViewController Документация :

ЕслиВы переопределяете этот метод (loadView) для того, чтобы создавать свои представления вручную, вы должны сделать это и присвоить корневое представление вашей иерархии свойству view.(Представления, которые вы создаете, должны быть уникальными экземплярами и не должны использоваться совместно с любым другим объектом контроллера представления.) Ваша пользовательская реализация этого метода должна не вызывать super.

Если вы хотите выполнить любую дополнительную инициализацию ваших представлений, сделайте это с помощью метода viewDidLoad. В iOS 3.0 и более поздних версиях вам также следует переопределить метод viewDidUnload, чтобы освободить любые ссылки напредставление или его содержимое.

Попробуйте ввести весь код кнопки в viewDidLoad:

- (void)buttonResponse:(id)sender {
    NSLog(@"Button touched up inside!!!!!");
}

- (void)loadView {
    // Dont call super (according to the UIViewController docs)
    // [super loadView];

    // self.view = ... however your setting up self.view 
    // self.view.frame = CGRectMake....
    // self.view.etc...
    [self.view setNeedsDisplay];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    button = [UIButton buttonWithType:UIButtonTypeCustom];
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Button" ofType:@"png"]; 
    UIImage *image = [UIImage imageWithContentsOfFile:filePath];
    CGSize imageSize = [image size];
    CGRect buttonFrame = CGRectMake(0,0,imageSize.width + 100, BUTTONBAR_H + 100);
    button.frame = buttonFrame;
    [button setImage:image forState:UIControlStateNormal];
    button.backgroundColor = [UIColor blueColor];
    [button setTitle:@"" forState:UIControlStateNormal];
    button.userInteractionEnabled = YES;
    [button addTarget:self action:@selector(buttonResponse:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:button];
    [self.view bringSubviewToFront:button];    
}

- (void)dealloc {
    [button release];
    [super dealloc];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...