我遇到了一点问题,当我尝试使用(无效)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”
我假设你想在一个子类实现这个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模拟器。 惊叹于日志消息。
你有旧的方法来实现? 如果你有旧的应用程序范围方法来实现,则需要将其删除新的一个将被称为前。