2012-04-03 10 views
1

Ich entwickle eine iPhone App, die einen Einkaufswagen enthält, und ich verwende eine UITableView, um den Warenkorb anzuzeigen. Es gibt eine Zelle für jeden Artikel, und die -tableFooterView ist auf eine benutzerdefinierte Ansicht eingestellt, die dem Benutzer ein Textfeld gibt, um den CVV ihrer Kreditkarte und eine Schaltfläche zu überprüfen, um den Kaufvorgang abzuschließen.UIButton in der Fußzeile der Tabelle reagiert nicht auf Berührungen, wenn die Tastatur angezeigt wird

Wenn der Benutzer das CVV-Textfeld antippt, ändere ich die Größe der Tabelle, so dass die Tastatur nichts bedeckt.

- (void)keyboardWillShow:(NSNotification *)n 
{ 
    // I'll update this to animate and scroll the view once everything works 
    self.theTableView.frameHeight = self.view.frameHeight - KEYBOARD_HEIGHT_PORTRAIT_IPHONE; 
} 

Nach ihrer CVV Eingabe kann der Anwender die Taste Fertig, tippen Sie auf die Tastatur schließen:

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 
    return NO; 
} 

All das funktioniert, aber während die Tastatur sichtbar ist, meine Kasse Taste (eine normale UIButton) reagiert nicht auf Berührungsereignisse. Die Tabelle scrollt, aber das touchUpInside-Ereignis der Schaltfläche wird nie ausgelöst.

Sobald ich auf "Fertig" klicke und die Tastatur geschlossen wird, erkennt die Checkout-Schaltfläche "touchUpInside" -Ereignisse.

Von dem, was ich gesehen habe, scheint es, dass jede Taste, die von der Tastatur abgedeckt wurde, nicht auf meine Berührungen reagiert (auch nicht von der Tastatur), bis die Tastatur geschlossen wird. Schaltflächen in der gleichen tableFooterView, die nie von der Tastatur abgedeckt werden, bleiben auf Berührung reagieren, während die Tastatur sichtbar ist.

gleiches Verhalten, wenn auf iOS 5 und iOS 4.

Kann jemand irgendwelche Vorschläge von anbieten, was gehen kann? Oder hilfreiche Ideen zur Fehlerbehebung?

Danke!

bearbeiten - Update

In der Tat, der Teil des tableFooterView, die von der Tastatur abgedeckt reagiert nicht Ereignisse zu berühren. In meiner benutzerdefinierten UIView-Unterklasse habe ich -touchesBegan:withEvent: implementiert und protokolliert nur, dass eine Berührung aufgetreten ist.

Wenn Sie an einer beliebigen Stelle in der Ansicht berühren, wird eine Protokollanweisung angezeigt, bevor die Tastatur angezeigt wird. Nachdem die Größe der Tabellenansicht geändert wurde, wird jedoch nur durch Berühren des oberen Teils der Ansicht eine Protokollanweisung generiert.

Auch ich gerade festgestellt, der Teil der TableFooterView, der von der Tastatur abgedeckt wurde, wird zu der Farbe der Hintergrundfarbe der enthaltenden Ansicht, sobald ich diesen Teil scrollen, um sichtbar zu sein.

+0

hast du eine Lösung dafür gefunden? – rishi

+0

@rishi hast du vielleicht eine Lösung gefunden? :) – vburojevic

+0

@vburojevic ja, aber die Lösung war ein bisschen seltsam :), werde ich das als Antwort posten – rishi

Antwort

0

Ich denke, dass die Größenänderung der UITableView verursacht, dass es die UIButton (eine Unteransicht) an die Rückseite der View-Hierarchie sendet. Möglicherweise müssen Sie es nach der Größenänderung des Rahmens explizit nach vorne bringen.

1

Ich hatte das gleiche Problem. Ich denke, es ist ein Fehler in iOS ist, aber ich habe eine Lösung für sie gefunden:


- (void)keyboardWillShow:(NSNotification *)note { 
    NSDictionary* userInfo = [note userInfo]; 

    // get the size of the keyboard 
    NSValue *boundsValue = [userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey]; 
    CGSize keyboardSize = [boundsValue CGRectValue].size; // screen size 
    CGFloat keyboardHeight; 
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || 
     self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
     keyboardHeight = keyboardSize.height; 
    } else { 
     keyboardHeight = keyboardSize.width; 
    } 

    // resize the view with the keyboard 
    __block CGRect origFrame = self.view.frame; 
    __block CGRect viewFrame = origFrame; 
    viewFrame.size.height -= keyboardHeight - ((self.tabBarController != nil) ? self.tabBarController.tabBar.frame.size.height : 0); 
    // Set the height to zero solves the footer view touch events disabled bug 
    self.view.frame = CGRectMake(origFrame.origin.x, origFrame.origin.y, 
           viewFrame.size.width, 0); 
    // We immediately set the height back in the next cycle, before the animation starts 
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
     self.view.frame = origFrame; // The original height 
     // start the animation 
     [UIView animateWithDuration:0.4 animations:^{ 
      [self.view setFrame:viewFrame]; 
     }]; 
    }); 
} 

Der Trick ist, die Höhe des Tableview auf 0 und zurück zum ursprünglichen im nächsten Laufzyklus einzustellen.

Das funktioniert für mich entweder iOS 4.3 und 5.1.

0

Following arbeitete für mich.

eine Tabellenansicht Fußzeile mit Knopf hatte, denn die Button-Aktion über xib verbunden ist, ansonsten hinzugefügt folgenden Code mehr -

@IBOutlet private weak var myButton: CustomUIButton! 

override public func awakeFromNib() { 
    super.awakeFromNib() 

    let myButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(myButtonAction(_:))) 
    myButton.addGestureRecognizer(myButtonTapGesture) 
} 

@IBAction func myButtonAction(_ sender: AnyObject) { 
    // button action implementation 
} 

Also muss ich auf, um eine Tippgeste hinzuzufügen.

Verwandte Themen