motionBegan: Не Работа

База данных для данных

Файловая система для файлов

12
задан PF1 1 September 2009 в 23:39
поделиться

2 ответа

Я предполагаю, что вы хотите реализовать это в подклассе UIViewController . Сделайте UIViewController способным стать первым респондентом:

- (BOOL)canBecomeFirstResponder {
     return YES;
}

Сделайте UIViewController первым отвечающим в viewDidAppear: .

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

Если представление содержит какой-либо элемент, такие как UITextField , который может сам стать первым респондентом, гарантирует, что элемент уйдет в отставку первого респондента в какой-то момент. Например, с UITextField , UIViewController должен будет реализовать протокол UITextFieldDelegate и фактически быть делегатом. Затем в textFieldShouldReturn:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
    // Hides the keyboard
    [theTextField resignFirstResponder];
    // Returns first responder status to self so that shake events register here
    [self becomeFirstResponder];
    return YES;
}

Реализуйте motionEnded: withEvent:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    if ( event.subtype == UIEventSubtypeMotionShake ) {
    // Do something
    }

    if ([super respondsToSelector:@selector(motionEnded:withEvent:)]) {
        [super motionEnded:motion withEvent:event];
    }
}

Существует хороший пост Мэтта Дранса из Apple на форумах разработчиков iPhone (требуется регистрация в качестве разработчика).

Обновление: реализация в подклассе UIView

Как обсуждалось в комментарии, это также работает, что неудивительно, в подклассе UIView . Вот как построить минимальный пример.

Создайте новый проект приложения на основе представления, назовите его ShakeTest . Создайте новый подкласс UIView , назовите его ShakeView . Сделайте так, чтобы ShakeView.h выглядел так:

#import <UIKit/UIKit.h>
@interface ShakeView : UIView {
}
@end

Сделайте ShakeView.m следующим образом:

#import "ShakeView.h"
@implementation ShakeView
- (BOOL)canBecomeFirstResponder {
    return YES;
}
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    if ( event.subtype == UIEventSubtypeMotionShake ) {
        NSLog(@"Shake!");
    }

    if ([super respondsToSelector:@selector(motionEnded:withEvent:)]) {
        [super motionEnded:motion withEvent:event];
    }
}
@end

Сделайте ShakeTestViewController.h таким:

#import <UIKit/UIKit.h>
#include "ShakeView.h"
@interface ShakeTestViewController : UIViewController {
    ShakeView *s;
}
@end

] Сделайте так, чтобы ShakeTestViewController.m выглядел так:

#import "ShakeTestViewController.h"
@implementation ShakeTestViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    s = [[ShakeView alloc] init];
    [[self view] addSubview:s];
    [s becomeFirstResponder];
}
- (void)dealloc {
    [s release];
    [super dealloc];
}
@end

Выполните сборку и запустите. Нажмите Cmd-Ctrl-Z, чтобы встряхнуть симулятор iPhone.

31
ответ дан 2 December 2019 в 04:53
поделиться

У вас реализован старый метод

'acelerometer: didAccelerate'

? Если у вас реализован старый метод для всего приложения, вам необходимо удалить его, прежде чем будет вызван новый.

0
ответ дан 2 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: