【问题标题】:On shake... iOS摇晃... iOS
【发布时间】:2011-06-16 02:37:29
【问题描述】:

所以我有一个 IBAction yesNo 我想在一次摇动事件中运行。不太清楚为什么这不起作用。已遵循所有文档。

-(BOOL)canBecomeFirstResponder
{
    return YES;
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event 
{
    if (event.subtype == UIEventSubtypeMotionShake)
    {
        [self yesNo];
    }
}

然后是 IBAction 本身:

- (IBAction)yesNo 
{
    int rNumber = rand() % 26;  
    NSUserDefaults *def=[NSUserDefaults standardUserDefaults];
    if ([[def objectForKey:@"activeVersion"] isEqualToString:@"0"])
    {
        switch (rNumber) {
            case 0:
                result.text  = @"Never";
                break;
            case 1:
                result.text = @"If you're lucky...";
                break;
            case 3:
                result.text = @"Think twice";
                break;
            ...
            default:
                break;
        }
    }
    else if ([[def objectForKey:@"activeVersion"] isEqualToString:@"1"])
    {
        switch (rNumber) {
            case 0:
                result.text  = @"Never1";
                break;
            case 1:
                result.text = @"If you're lucky...1";
                break;
            ...
            case 25:
                result.text = @"Very doubtful2";
                break;

            default:
                break;
        }
    }
    else if ([[def objectForKey:@"activeVersion"] isEqualToString:@"3"])
    {
        switch (rNumber) {
        case 0:
            result.text  = @"Never3";
            break;
        ...
        case 25:
            result.text = @"Very doubtful3";
            break;

        default:
            break;
    }
}   
}

基本上我有一个幸运球类型的东西,当 iPhone 摇晃时,我需要运行 IBAction。

【问题讨论】:

  • 在什么情况下它不起作用? yesNo 被调用了吗?你有错误吗?
  • 您在哪里设置键 activeVersion 的值?它可能不满足任何条件。是否检查过该方法是否被日志记录调用?

标签: iphone ios xcode shake first-responder


【解决方案1】:

您是否已将该视图设为第一响应者? IE。 [yourView becomeFirstResponder];(可能来自某些viewDidAppear: 方法)。 您可能想检查它是否真的是您摇动设备时的第一响应者。

【讨论】:

    【解决方案2】:

    当我从在 IB 中以图形方式定义所有内容切换到在 Xcode 中以编程方式内联时,我完全忘了让视图成为第一响应者。这是最终修复它的代码:

    -(void)viewDidAppear:(BOOL)animated{
        [super viewDidAppear:animated];
        [self becomeFirstResponder];
        NSLog(@"self is first responder %i",[self isFirstResponder]);
    }
    

    【讨论】:

      【解决方案3】:

      我要问的第一件事是这是否应该定义为 IBAction。如果您只从代码中调用它,那么您可能需要考虑使用 (void) 代替(只是样式选择)。

      其次,您确定该方法实际上正在被调用吗?在那里扔一个 NSLog 以确保。

      第三,你确定 [def objectForKey:@"activeVersion"] 返回一个字符串吗?返回的值是否符合您的预期?在那里扔一个 NSLog 以确保。

      我的猜测是,其中一个 NSLog 将为您提供问题的答案,因为您的其余代码似乎都很好。

      【讨论】:

      • +1 我同意这些观点,特别是使其无效并正确使用 NSLog 和调试。
      • 是的,yesNo 方法有效。我还有一个按钮,如果触摸球区域,则运行该方法。是的,def objectForKey 正在返回一个字符串。
      • 那么你还有一些调试工作要做。将更多 NSLogs 放在您希望代码运行的地方,或者如 Luke 所说,开始使用断点。请不要误会,但调试是编程的核心能力。了解如何去做,您可以花 5 分钟时间找出问题所在,而不是花一整天时间在 stackoverflow 上来回走动。归根结底,您的变量之一不正确,或者您的检查(switch 语句、if 语句等)没有返回您期望的结果。 Apple 为您提供了查找东西的工具,请使用它们。
      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多