2

こんにちは、私はユーザーが Facebook のピンウォールに何かを投稿できるようにするアプリを持っています。Facebook から直接 DemoApp を使用してセットアップしました。

ユーザーがデバイスを振ったときに何かを行う振れ検出を実装しました。ただし、これらの 2 つの関数は同じビューコントローラーにあるため、どちらも機能しなくなりました。

  • 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、シェイク)を機能させるために何を変更する必要があるか教えてもらえますか?どうもありがとう、ドゥーノット

4

3 に答える 3

1

XCode で単純なビュー ベースのプロジェクトを作成しましたが、次のように動作します。私は Facebook をミックスに追加しませんでしたが、UITextField はそれをシミュレートする必要があります。これが行うことは次のとおりです。

  1. UIButton に触れるか、デバイスを振ると、キーボードの表示/非表示を含む 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
于 2011-04-05T17:10:51.903 に答える
0

XJones のおかげで、ようやく問題を解決することができました。

@XJones、アプリをデフォルトの機能に減らしていたところ、モーションをキャッチできなかった理由と、Facebookのキーボードに問題があった理由がわかりました。

私の MainWindow.xib ファイルは完全に間違っていて、デリゲートも設定されていませんでした。私はxibファイルを削除し、デリゲートとウィンドウをマッピングしました。それだけです。モーションをキャッチできるようになり、Facebookの投稿も魅力のように機能します:)

世話をしてくれて、あなたの助けを提供してくれてありがとう!!

于 2011-05-04T19:24:47.983 に答える
0

[self becomeFirstResponder] を viewDidAppear に挿入してみてください

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

ここにドキュメント

于 2011-04-05T12:43:42.993 に答える