motionBegan: Funktioniert Nicht
Habe ich ein bisschen ein problem, wenn ich versuche zu verwenden (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event-in um capture ein shake event. Das problem ist, dass die Funktion gar nicht ausgeführt, selbst wenn ich das überschreiben canBecomeFirstResponder und setzen Sie es zurück, JA. Ich habe einige Beiträge anderer Leute mit diesem problem, aber ich habe keine Antwort gefunden.
Vielen Dank für jede Hilfe!!!
Ersten Beispiel .h (Klasse erbt von UIView - Ist "als" aus dem app-delegate-Klasse)
{
@class TestApplicationView;
@interface TestApplicationView : UIView {
IBOutlet UIView *view;
}
}
Ersten Beispiel .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]);
}
}
Zweiten Beispiel .h (Klasse geerbt von UIApplicationDelegate und UIScrollViewDelegate)
{
#import <UIKit/UIKit.h>
@class TestApplicationViewController;
@interface TestApplicationAppDelegate : NSObject <UIApplicationDelegate, UIScrollViewDelegate> {
IBOutlet UIWindow *window;
IBOutlet UIScrollView *scrollView;
}
}
Zweiten Beispiel .m
{
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
[self becomeFirstResponder];
}
}
-- Das zweite Beispiel gibt die folgende Warnung: 'TestApplicationAppDelegate' kann nicht Antworten '-becomeFirstResponder'
InformationsquelleAutor PF1 | 2009-08-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, Sie möchten, implementieren Sie diese in einer Unterklasse von
UIViewController
. Machen dieUIViewController
fähig zu werden first responder:Machen die
UIViewController
werden first responder inviewDidAppear:
.Wenn die Sicht enthält jedes element, wie ein
UITextField
, könnte sich die first responder, selbst, sicherzustellen, dass element tritt zurück first responder an einem gewissen Punkt. Mit einemUITextField
zum Beispiel dieUIViewController
würde die Notwendigkeit zur Umsetzung derUITextFieldDelegate
Protokoll, und tatsächlich werden die Delegierten. Dann, intextFieldShouldReturn:
Implementieren
motionEnded:withEvent:
Es ist ein guter Beitrag von Matt Drance von Apple in das iPhone Developer Forum (erfordert Registrierung als Entwickler).
Update: die Implementierung in einer Unterklasse von UIView
Diskutiert in den Kommentaren, funktioniert das auch, nicht allzu überraschend, in einer Unterklasse von
UIView
. Hier ist, wie zu konstruieren ist ein minimal-Beispiel.Erstellen Sie eine neue Ansicht-basierte Anwendung, Projekt, nennen Sie es
ShakeTest
. Erstellen Sie eine neue Unterklasse vonUIView
nennen esShakeView
. MachenShakeView.h
wie folgt Aussehen:Machen
ShakeView.m
wie folgt Aussehen:Machen
ShakeTestViewController.h
wie folgt Aussehen:Machen
ShakeTestViewController.m
wie folgt Aussehen:Erstellen und ausführen. Drücken Sie " Cmd-Ctrl-Z, schütteln Sie die iPhone-simulator. Bestaunen Sie die log-Meldung.
Das sollte nicht verhindern, dass es funktioniert, Nein. Sie müssen nur gehen durch die gleichen Schritte: sicherstellen, dass das Objekt zum first responder, und stellen Sie sicher, dass Sie ist der first responder, wenn die shake-event kommt. Zum Beispiel, wenn ein Kind UITextField ist first responder-wenn das schütteln tritt auf, es wird das Ereignis erhalten, und da es ihm gelingt, sein eigenes Verhalten (shake to undo) für einen shake, das Ereignis wird nicht sprudeln, wo Sie implementieren, motionEnded:withEvent:.
Für einige Grund, es immer noch nicht funktioniert... ich benutze die neueste SDK und rufen Sie [selbst becomeFirstResponder]; innerhalb einer Funktion, dass ich weiß, läuft jedes mal. Jedoch, jedes mal, wenn ich versuche die Funktion zu laufen, ist es nicht. Ist es möglich zu überprüfen, welche UIView/UITextField ist der first responder zu einem bestimmten Zeitpunkt in der app? Ich denke, das kann mir helfen, die Spur, warum es nicht ausgeführt wird (wenn ein anderes element gesetzt wird, der first responder zu einem späteren Zeitpunkt).
Es sagt, dass, obwohl das UIView kann nicht Antworten viewDidAppear:(BOOL)animated... Könnte das der Grund sein, warum es nicht funktioniert?
Sorry, ich meinte, Sie gehen durch die gleiche allgemein - Schritte.
viewDidAppear:
ist eine bequeme Methode zu verwenden, um nehmen Sie die erste responder-status wenn Sie einUIViewController
. Wenn Sie verwenden müssen einUIView
für diese, Sie gehen zu müssen, um zu rufenbecomeFirstResponder
woanders. Sie können sehen, ob ein UI-element first responder jederzeit mitisFirstResponder
.InformationsquelleAutor Paul A. Hoadley
Haben Sie die alte Methode implementiert? Wenn Sie die alte Anwendung breit-Methode implementiert, die Sie brauchen, um es zu entfernen, bevor das neue aufgerufen wird.
Ich bezog mich auf die alte Art und Weise der Aufdeckung von shakes. Der Beschleunigungsmesser:didAccelerate Methode. Hast du das irgendwo umgesetzt?
Oh, Nein. Ich habe gerade ein neues Projekt erstellt vor ein paar Tagen, und bin nur mit der motionBegan: Methode.
InformationsquelleAutor Jab