2008-12-17 4 views
24

In meiner Anwendung habe ich eine UITextField innerhalb einer UITableViewCell. Wenn ich innerhalb des Textfelds klicke und etwas Text hinzufüge, finde ich, dass wenn es versucht, den Einfügepunkt zu verschieben, es das erste Mal funktioniert, aber bei nachfolgenden Versuchen fehlschlägt. Ich kann die Auswahl nicht vollständig verschieben. Kein "Vergrößerungsglas" erscheint.Bearbeiten eines UITextField in einem UITableViewCell schlägt fehl

Noch neugieriger scheint diese "Einstellung" dauerhaft zu sein, bis ich die Anwendung neu starte. Und es betrifft alle UITextFields auf diesem Bildschirm und nicht nur die, die ich ursprünglich versuchte zu bearbeiten.

Wenn Sie es selbst sehen möchten, probieren Sie das Beispiel "UICatalog" aus, das mit dem iPhone SDK geliefert wird. Klicken Sie auf "Textfelder" und dann auf "Bearbeiten" und spielen Sie mit den Textfeldern herum.

Ich habe viel getan, aber es ist ziemlich schwer für Google! Die besten Referenzen, die ich gefunden habe, sind auf Apple's support board und MacRumors formum (beide beziehen sich auf eine Lösung, die anscheinend auf dem iPhone 2.0 funktioniert, funktioniert aber nicht mit modernen Versionen - ich habe es versucht).

Mein Gefühl ist, dass dies ein Fehler im Betriebssystem ist, aber ich dachte, ich würde dies an die SO-Crowd für eine zweite Meinung werfen und sehen, ob es irgendwelche Workarounds gibt. Irgendwelche Ideen?

Nach dem Vorschlag von Benzado habe ich versucht, meine Anwendung mit den SDKs 2.0, 2.1 und 2.2 zu erstellen. Ich habe das gleiche Verhalten in allen Versionen. (Eigentlich etwas zusammen, aber nicht das gleiche brach in 2.2, aber das ist wahrscheinlich eine andere Frage!)

Antwort

12

Ich verbrachte viel Zeit damit, aber ich denke, dass ich es genagelt habe.

Der Trick ist, dass die Tabelle editierbar sein muss (d. H. Ihre editing Eigenschaft muss auf YES gesetzt werden). Die gute Nachricht ist, dass Sie jetzt den Einfügepunkt verschieben können. Manchmal erscheint die Lupe nicht oder folgt nicht, aber Ihre Geste scheint immer zu funktionieren.

Ist dies immer noch ein Fehler? Vielleicht. Zumindest sollte die SDK-Dokumentation von Apple aktualisiert werden. Ich habe einen Fehlerbericht mit Apple zur Deckung gebracht (rdar: // 6462725).

+0

Wow, ich habe gerade das gleiche Problem in meiner App bemerkt. Ich habe deinen Trick ausprobiert und es funktioniert jetzt gut, danke! Darüber hinaus musste ich TableView: canEditRowAtIndexPath: und TableView: CanMoveRowAtIndexPath: NO zurückgeben, so dass die Tabelle nicht wie im Bearbeitungsmodus aussieht! – squelart

+0

Vielen Dank an Sie für diese Lösung –

+0

UITableView hat keine bearbeitbare Eigenschaft, nur UITextField macht ... sprechen Sie über die/editing/-Eigenschaft in UITableView? oder ist es auf UITableViewCell? –

0

Es klingt wie ein OS-Bug. Ich würde versuchen, es zu reproduzieren, indem Sie das UICatalog-Beispiel für die SDKs 2.0, 2.1 und 2.2 ausführen, um zu sehen, ob sich etwas ändert. (Es gibt einen Fehler im Zusammenhang mit Tabellenzellen Textausrichtung, die auftritt, wenn Sie für 2.2 erstellen, aber nicht, wenn Sie für 2.1 erstellen, unabhängig davon, welche Version des Betriebssystems auf dem Gerät ist.)

Wenn es sich herausstellt, einen Unterschied zu machen , https://bugreport.apple.com/

+0

Danke für die Vorschläge zu tun. Ich werde definitiv versuchen, mit verschiedenen Versionen des SDK zu bauen. Ich hatte angenommen, dass es die Version des Betriebssystems war, auf der der Code lief, aber natürlich, wenn Sie davon ausgehen, dass ... –

0

Ich versuchte dies mit meiner Anwendung und es scheint zu funktionieren wie erwartet. Ich bekomme jedes Mal eine Lupe. Ich benutze das 2.1 SDK.

+0

Interessant. Wie unterscheidet sich Ihre Verwendung von UITableView, UITableViewCell und UITextField von der im UICatalog-Beispiel? –

2

Dank dieses Beitrags konnte ich erfolgreich in meiner App funktionieren.

etwas hinzufügen, aber:

Wenn Sie Ihre Tabelle editierbar sein, werden Sie wahrscheinlich ein anderes Verhalten als Sie (Einrücken, Bearbeitung Widgets, keine Offenlegung Indikatoren, etc.) zu erwarten.Das überraschte mich, aber hier ist, wie am besten damit umgehen:

In Ihrem UITableView Delegierten implementieren:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

Dann in Ihrer UITableViewCell-Implementierung, Ihre UITableView nur gesetzt werden editierbar, wenn Sie tatsächlich gerade bearbeiten :

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    ((UITableView *)[self superview]).editing = YES; 
... 
} 

und deaktivieren die Bearbeitung bei der Bearbeitung fertig ist:

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
... 
    ((UITableView *)[self superview]).editing = YES; 
} 

Dadurch wird sichergestellt, dass sich Ihre Tabelle nicht im Bearbeitungsmodus befindet, wenn Sie die Zelle nicht bearbeiten, damit die Dinge reibungslos funktionieren.

Danke!

Brian M. Criscuolo Mark/Space Inc.

2

Die Antwort von Brian M. Criscuolo ist in der Nähe, aber es ist immer noch nicht ganz richtig - in meiner Nutzung von SDK2.2.1 finde ich, dass ich zu tun habe die folgenden:

Um Ihre UITableViewDelegate (was oft Ihre UITableViewController) in die beiden folgenden:

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

und:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewCellEditingStyleNone; 
} 

und:

- (void)viewDidLoad { 
[super viewDidLoad]; 

    // do any other customisation here 
self.uiTableView.editing = true; 
} 

Wenn Sie nicht die beiden oberen Delegatmethoden setzen Sie, bewirkt, dass der oben die Lösch Symbole neben jeder Zeile, und die Vertiefung jeder Reihe.

Sie sollten nichts mit Textfield-Delegaten tun müssen, wie Brian es anführte (es sei denn, Sie haben mehrere Zeilen und möchten auf ein didSelectRowAtIndexPath: -Ereignis reagieren, das Sie im Bearbeitungsmodus nicht zu bekommen scheinen) muss auch tun, was er vorschlägt).

By the way - dies in SDK3.0 fixiert scheint

0

tatsächlich (obwohl Thema, das ich denke, ändern), was scheint, funktioniert am besten, um die Tabelle „Bearbeiten“ Eigenschaft auf true in „viewDidLoad“ zu sein zu setzen und das Hinzufügen diese an den Tisch Delegierten

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; 
} 

Sie brauchen nichts in das Textfeld ein Delegierter