motionBegan:不工作(motionBegan: Not Working)

2019-06-21 04:42发布

我遇到了一点问题,当我尝试使用(无效)motionBegan:为了拍摄抖动事件(的UIEvent *)事件:(UIEventSubtype)运动withEvent。 问题是,该功能甚至没有运行,即使我重写canBecomeFirstResponder并将其设置为返回YES。 我已经看到了一些其他人的这个问题的帖子,但我还没有找到答案。

谢谢你的帮助!

第一实施例的.h(从UIView的继承的类 - 从所述应用程序委托的类是“称为”){

@class TestApplicationView;

@interface TestApplicationView : UIView {

    IBOutlet UIView *view;
}

}

第一实施例的.m {

- (id)initWithCoder:(NSCoder *)coder
{
    [self setUpView];
    return self;
}

- (id)initWithFrame:(CGRect)frame
{
    [self setUpView];
    return self;
}

- (void)setUpView
{
    [self becomeFirstResponder];
    NSLog(@"First Responder - %d", [self isFirstResponder]);
}

}

第二实施例的.h(从UIApplicationDelegate和UIScrollViewDelegate继承的类){

#import <UIKit/UIKit.h>

@class TestApplicationViewController;

@interface TestApplicationAppDelegate : NSObject <UIApplicationDelegate, UIScrollViewDelegate> {

IBOutlet UIWindow *window;
IBOutlet UIScrollView *scrollView;
}

}

第二实施例的.m {

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    [self becomeFirstResponder];
}

}

- 第二个示例返回以下警告:“TestApplicationAppDelegate”可以不响应“-becomeFirstResponder”

Answer 1:

我假设你想在一个子类实现这个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];
    }
}

有一个很好的职位由苹果公司的Matt Drance在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模拟器。 惊叹于日志消息。



Answer 2:

你有旧的方法来实现? 如果你有旧的应用程序范围方法来实现,则需要将其删除新的一个将被称为前。



文章来源: motionBegan: Not Working