Frage

Ich habe eine Unterklasse eines UIViews (MyView), der einen UITextField als Unteransichten enthält.MyView implementiert das UITextFieldDelegate-Protokoll, um benachrichtigt zu werden, wenn auf die Textfelder geklickt wird.Das hat gut funktioniert.Jetzt muss ich die Textfelder in einer Art "Container" platzieren, um diesen Container (und alle seine untergeordneten Elemente) mit einer UIView-Animation ein- und ausblenden zu können.Also habe ich eine UIView (MySubview) erstellt, eine Unteransicht von MyView erstellt und alle Textfelder darin platziert.Die Animation funktioniert einwandfrei, aber der UITextFieldDelegate wird nicht mehr aufgerufen.Ich denke, das liegt daran, dass die Textfelder keine direkten Kinder von MyView mehr sind. Gibt es andere Möglichkeiten, damit umzugehen?

UPDATE

Ich habe eine kleine Version meines Codes erstellt. Vielleicht hilft dies, das Problem zu finden:

@interface MyView : UIView <UITextFieldDelegate>


@implementation MyView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        // This is MySubview:
        UIView *tempLabelsContainer = [[UIView alloc] initWithFrame:self.bounds];
        [tempLabelsContainer setUserInteractionEnabled:YES];
        [self addSubview:tempLabelsContainer];
        self.labelsContainer = tempLabelsContainer;
        [tempLabelsContainer release];

        UITextField *aTextField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
        [aTextField setBackgroundColor:[UIColor clearColor]];
        [aTextField setText:@"Some text"];
        [aTextField setTag:1];
        [aTextField setDelegate:self];
        [self.labelsContainer addSubview:aTextField];
        [aTextField release];

        // More labels are being added
    }

    return self;
}

#pragma mark - UITextFieldDelegate methods

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // This is not being called
    NSLog(@"TextField with the tag: %d should be edited", [textField tag]);    

    return NO;
}

War es hilfreich?

Lösung 2

Ich werde meine eigene Frage beantworten, falls jemand das gleiche Problem hat - schwer vorstellbar, dass jemand solch einen dummen Fehler macht:

Ich habe den Rahmen des Etikettencontainers auf self.bounds gesetzt.Aber der MyViewController hat MyView mit einem Rahmen von CGRectZero erstellt!Ich habe diese Änderung vorgenommen, um die Animation zu unterstützen, während ich den Container hinzugefügt habe.Daher dachte ich, dass das Problem mit der Ansichtshierarchie zu tun hat.Schande über mich!!!

Wie auch immer, danke an alle Helfer, besonders an Madhumal Gunetileke, der mich mit seiner Antwort dazu gebracht hat, in eine andere Richtung zu schauen.

Andere Tipps

Okay, dann habe ich versucht, Ihren Code zu schreiben, und es funktioniert für mich.Hier sind einige Elemente, die Sie ändern können:

  • Der Grund, warum Sie Ihr textField nicht bearbeiten können, liegt darin, dass Sie NO an die textFieldShouldBeginEditing-Methode zurückgeben.Ändern Sie dies in JA.
  • Versuchen Sie, Ihr Textfeld (wenn möglich) etwas unter dem von Ihnen angegebenen Wert zu positionieren.Außerdem ist 20px sowieso zu klein für ein richtiges Textfeld, machen Sie das mindestens 40px.Ein bei 0,0 positioniertes 20px-Textfeld kann vollständig ausgeblendet sein, wenn die Statusleiste im Telefon aktiviert ist.
  • Legen Sie einen borderStyle für Ihr textField fest.Soweit ich weiß, ist es wichtig, dass ein Textfeld gut angezeigt wird und gut interagiert.(z. B. textField.borderStyle= UITextBorderStyleRoundRect)

    Daumen drücken!:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top