2

大家好,我有一个应用程序,我允许用户在他们的 facebook 的 pinwall 上发布一些东西。我直接从 Facebook 使用 DemoApp 进行设置。

我已经实现了一个抖动检测,当用户摇动设备时它会做一些事情。然而,由于这两个函数在同一个视图控制器中,它们都不再工作了。

  • 当 Facebook 弹出登录窗口时,键盘不再出现。
  • 不再检测到震动。

我想这与第一响应者有关。我已经尝试了很多事情,但我无法解决它。这是我的代码的必要部分。

在 facebook pinwall 上发布一些内容:

- (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)工作?非常感谢,donot

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

尝试在 viewDidAppear 中插入 [self becomeFirstResponder]

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

这里的文档

于 2011-04-05T12:43:42.993 回答
0

感谢 XJones,我终于能够解决我的问题。

@XJones,我正在将我的应用程序缩减为默认功能,并发现为什么我无法捕捉动作以及为什么我的 facebook 键盘出现问题。

我的 MainWindow.xib 文件完全错误,也没有设置委托。我删除了 xib 文件、映射的委托和窗口,就是这样,我现在可以捕捉动作,甚至 facebook 发布都像魅力一样 :)

非常感谢您的关心和帮助!!

于 2011-05-04T19:24:47.983 回答