16 Stimmen

Kann UIButton, der mit IB erstellt wurde, nicht programmatisch ausblenden

Mein iOS UIButton ist korrekt von IB mit einem IBOutlet in meinem View-Controller verbunden, da ich seinen Titel aus meinem Code ändern kann. Dh:

[self.myButton setTitle:@"neuer Titel" forState:UIControlStateNormal]; //funktioniert

Allerdings,

[self.myButton setHidden:YES]; //funktioniert nicht
//oder
self.myButton.hidden = YES; //funktioniert nicht

Was ist hier los? Wie kann ich meinen Button verschwinden lassen?

Aktualisierung: einige zusätzliche Informationen

Hier ist der relevante Code für meinen UIButton:

In meiner .h Datei

IBOutlet UIButton *myButton;
-(IBAction)pushedMyButton:(id)sender;
@property (nonatomic,retain) UIButton *myButton;

In meiner .m Datei

@synthesize myButton;
- (void)pushedMyButton:(id)sender{
    self.myButton.hidden = YES;
}
- (void)dealloc{
    [self.myButton release];
}

21voto

DavidD Punkte 1011

Ok, ich habe eine Lösung gefunden, die funktioniert, aber ich weiß immer noch nicht, warum mein Originalcode nicht funktioniert hat. Ich habe Grand Central Dispatch verwendet, um einen Block mit dem Ausblendenaufruf in der Hauptwarteschlange zu versarbeiten, wie folgt:

dispatch_async(dispatch_get_main_queue(), ^{
    self.myButton.hidden = YES; //funktioniert
});

Interessant. Kein Teil des anfänglichen Codes in meinem IBOutlet war jedoch in GCD-Blöcke eingewickelt. Irgendwelche Ideen?

5voto

VdesmedT Punkte 8927

Das sollte funktionieren, versuchen Sie, es umzubenennen und auszublenden, nur um zu überprüfen, dass sich nicht zwei Schaltflächen übereinander befinden.

3voto

Amy Punkte 31

Ich hatte dasselbe Problem und fand die Lösung darin, das versteckte an der richtigen Stelle zu platzieren, in meinem Fall in der Funktion viewDidLoad.

3voto

momo Punkte 54

Benutzeroberflächen (UI) API (UIKit ...) Methoden müssen im Hauptthread ausgeführt werden!

Daher wird dies auf dem Hauptthread ausgeführt (wie *dispatch_get_main_queue*):

dispatch_async(dispatch_get_main_queue(), ^{
    self.myButton.hidden = YES; //funktioniert
});

ABER normalerweise machen wir so etwas:

[self performSelectorOnMainThread:@selector(showButton) withObject:nil waitUntilDone:NO];

[self performSelectorOnMainThread:@selector(hideButton) withObject:nil waitUntilDone:NO];

-(void)showButton
{
    myButton.hidden = NO;
}

-(void)hideButton
{
    myButton.hidden = YES;
}

Laut der Dokumentation von Apple: http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html " Thread-Überlegungen Manipulationen der Benutzeroberfläche Ihrer Anwendung müssen im Hauptthread erfolgen. Daher sollten Sie immer die Methoden der UIView-Klasse aus dem Code aufrufen, der im Hauptthread Ihrer Anwendung läuft. Die einzige Situation, in der dies nicht unbedingt erforderlich ist, ist bei der Erstellung des Ansichtsobjekts selbst, aber alle anderen Manipulationen sollten im Hauptthread erfolgen. "

0voto

TalL Punkte 1641

Was für mich funktioniert hat, ist das Platzieren des Manipulationscodes in viewDidLoad anstelle von initWithNibName, wie folgt:

- (void)viewDidLoad
{
    btnRestart.enabled = false;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X