motionBegan не вызывается во всем приложении - PullRequest
2 голосов
/ 16 марта 2011

Привет всем У меня есть приложение, в котором я разрешаю пользователю публиковать что-то на своей странице в Facebook. Я использовал DemoApp прямо из Facebook, чтобы настроить его.

Я реализовал функцию обнаружения сотрясений, которая что-то делает, когда пользователь встряхивает устройство. Однако, поскольку эти две функции находятся в одном контроллере вида, они больше не работают.

  • Когда Facebook открывает окно входа в систему, клавиатура больше не появляется.
  • Встряхивания больше не обнаруживаются.

Я полагаю, это как-то связано с первыми, кто отвечал. Я много чего перепробовал, но не смог решить. Вот необходимая часть моего кода.

Публикуйте что-нибудь на фейсбуке:

- (IBAction)publishStream{

    FactsAppDelegate *appDelegate = (FactsAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSMutableDictionary *dictionary = [[[NSMutableDictionary alloc] init]autorelease];
    [dictionary setObject:@"Du postest diesen Fact:" forKey:@"user_message_prompt"];
    [dictionary setObject:[[appDelegate.facts objectAtIndex:currentFactId] fact] forKey:@"message"];
    [_facebook dialog:@"feed" andParams:dictionary andDelegate:self];
}

Обнаружение встряхивания:

#pragma mark Motion catching
// shake motion began
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    if (motion != UIEventSubtypeMotionShake) return;

    // load next fact
    [self next];

    // vibrate
    [self vibrate];
}

Метод, необходимый для обнаружения дрожания:

#pragma mark Shake events are only detectable by the first responder
- (BOOL)canBecomeFirstResponder {
    return YES;
}

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

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self resignFirstResponder];
}

Может кто-нибудь сказать мне, что я должен изменить, чтобы оба (facebook, shake) работали? Большое спасибо, doonot

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

Я создал проект на основе простого представления в XCode, и следующие работы для меня.Я не добавил Facebook к миксу, но UITextField должен имитировать его.Что это делает:

  1. Касание кнопки UIB или встряхивание устройства переключит редактирование UITextField, включая отображение / скрытие клавиатуры

  2. UILabelstatusLabel отобразит последнее действие касания или встряхивания, а затем тайм-аут для отображения текста по умолчанию.

Вы можете создать аналогичный проект и скопировать / вставить его или попытаться работать с вашимсуществующее приложение.

ИЗМЕНЕНО В ДОБАВИТЬ .H ФАЙЛ

Заголовок:

// ShakeShakeShakeViewController.h

#import <UIKit/UIKit.h>

@interface ShakeShakeShakeViewController : UIViewController {
    UITextField *   _textField;
    UILabel *       _statusLabel;
    UIButton *      _actionButton;
}

@property (nonatomic, retain)       IBOutlet UITextField *  textField;
@property (nonatomic, retain)       IBOutlet UILabel *      statusLabel;
@property (nonatomic, retain)       IBOutlet UIButton *     actionButton;

- (IBAction)userInvokedActionWithControl:(id)sender;
- (void)resetStatusLabel;
- (void)toggleTextFieldEditing;

@end

Источник:

// ShakeShakeShakeViewController.m

#import "ShakeShakeShakeViewController.h"

@implementation ShakeShakeShakeViewController

@synthesize textField = _textField,
            statusLabel = _statusLabel,
            actionButton = _actionButton;

- (void)dealloc
{
    self.textField = nil;
    self.statusLabel = nil;
    self.actionButton = nil;
    [super dealloc];
}

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

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [self resetStatusLabel];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.textField = nil;
    self.statusLabel = nil;
    self.actionButton = nil;
}

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

- (IBAction)userInvokedActionWithControl:(id)sender
{
    NSLog(@"Touched");
    self.statusLabel.text = @"Touched";
    [self toggleTextFieldEditing];
}

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event 
{
    if (motion != UIEventSubtypeMotionShake) return;

    NSLog(@"Shaking...");
    self.statusLabel.text = @"Shaking...";
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    if (motion != UIEventSubtypeMotionShake) return;
    NSLog(@"Done shaking...");
    self.statusLabel.text = @"Done shaking";
    [self toggleTextFieldEditing];
}

- (void)toggleTextFieldEditing
{
    if ([self.textField isFirstResponder]) {
        [self becomeFirstResponder];
    }
    else {
        [self.textField becomeFirstResponder];
    }
    [self performSelector:@selector(resetStatusLabel) withObject:nil afterDelay:2];
}

- (void)resetStatusLabel
{
    self.statusLabel.text = @"Shake me";
}

@end
0 голосов
/ 04 мая 2011

Благодаря XJones я наконец смог решить мою проблему.

@ XJones, я сократил свое приложение до функций по умолчанию и выяснил, почему я не смог отловить движения и почему у меня были проблемы с клавиатурой facebook.

Мой файл MainWindow.xib был полностью неправильным, и делегат также не был установлен. Я удалил файл xib, сопоставил делегата и окно, и все, теперь я могу ловить движения, и даже публикация в фейсбуке работает как чудо:)

Большое спасибо за заботу и предложение вашей помощи !!

0 голосов
/ 05 апреля 2011

Попробуйте вставить [self intoFirstResponder] в viewDidAppear

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

Здесь документация

...