Wyłącz przycisk


97

Chcę wyłączyć przycisk ( UIButton) w systemie iOS po jego kliknięciu. Jestem nowy w programowaniu na iOS, ale myślę, że odpowiednik kodu w celu - C to:

button.enabled = NO;

Ale nie mogłem tego zrobić szybko.

Odpowiedzi:


207

Wartość logiczna dla NOjęzyka Swift to false.

button.isEnabled = false

powinien to zrobić.

Tutaj jest dokumentacja Swift dla UIControl„s isEnablednieruchomości.


Jest tak samo, niezależnie od tego, czy utworzyłeś przycisk za pomocą jego inicjatora, czy za pomocą scenorysów.
KerrM

Miałem na myśli, kiedy nie mam gniazdka. W każdym razie rozwiązaniem jest globalne zdefiniowanie przycisku.
Daniel Springer

44

Jeśli chcesz, aby przycisk pozostał statyczny bez wyglądu „wciśniętego”:

// Swift 2
editButton.userInteractionEnabled = false 

// Swift 3
editButton.isUserInteractionEnabled = false 

Zapamiętaj:

1) Twój IBOutletjest ->@IBOutlet weak var editButton: UIButton!

2) Kod powyżej wchodzi viewWillAppear


1
Myślałem, że to jest dokładnie to, czego szukałem, ale wydaje się, że to tylko UIKit, a nie AppKit.
drootang

12

Sposób, w jaki to robię, jest następujący:

@IBAction func pressButton(sender: AnyObject) {
    var disableMyButton = sender as? UIButton
    disableMyButton.enabled = false
}

IBAction jest połączony z twoim przyciskiem w scenorysie.

Jeśli masz skonfigurowany przycisk jako punkt sprzedaży:

    @IBOutlet weak var myButton: UIButton!

Następnie możesz uzyskać dostęp do włączonych właściwości za pomocą. notacja na nazwie przycisku:

    myButton.enabled = false

U mnie działa dobrze w Swift 4. Zauważyłem, że domyślnie ustawia on nadawcę na Any zamiast AnyObject, ale oba nadal działają… Jaki błąd otrzymujesz?
Krivvenz

Dla jasności, być może powinieneś zaznaczyć w swojej odpowiedzi powyżej, że IBOutlet jest wymagany do działania twojego kodu. To, czy IBOutlet był potrzebny, czy nie, jest tym, co mnie zdezorientowało. Oczywiście jest to potrzebne.

Nie jest to wymagane do działania. Możesz wpisać rzut przycisk w IBAction i zmienić status włączony lub jeśli masz go skonfigurowany jako IBOutlet, możesz to zrobić za pomocą .notacji na wylocie. Oba sposoby działają.
Krivvenz

Uważam, że IBOutlet jest potrzebny, jeśli chcesz wyłączyć przycisk z poziomu innej funkcji.


5

Dla tych, którzy wpisali w Google „wyłącz przycisk”, ale mogą mieć bardziej szczegółowe przypadki użycia:

Wyłącz z efektem wizualnym: Jak powiedzieli inni, zapobiegnie to naciśnięciu przycisku, a system automatycznie sprawi, że będzie wyglądał na wyłączony:

yourButton.isEnabled = false 

Wyłącz bez efektu wizualnego: Czy używasz przycisku w przypadku, gdy powinien wyglądać normalnie, ale nie powinien zachowywać się jak przycisk „lubi”, reagując na dotknięcia? Spróbuj tego!

yourButton.userInteractionEnabled = false

Ukryj bez wyłączania: To podejście powoduje ukrycie przycisku bez wyłączania go (niewidoczny, ale nadal można go dotknąć):

 yourButton.alpha = 0.0

Usuń: spowoduje to całkowite usunięcie widoku:

 yourButton.removeFromSuperView()

Stuknij coś za przyciskiem: Masz ustawione dwa przyciski i chcesz, aby górny przycisk tymczasowo zachowywał się tak, jakby go tam nie było? Jeśli nie będziesz ponownie potrzebować górnego przycisku, usuń go. Jeśli będziesz go ponownie potrzebować, spróbuj skondensować jego wysokość lub szerokość do 0!


1

Możesz włączyć / wyłączyć przycisk za pomocą właściwości isEnabledlub isUserInteractionEnabled.

Różnica między dwoma to:

  • isEnabledjest właściwością UIControl (super klasa UIButton) i ma efekty wizualne (tj. wyszarzone) włączania / wyłączania

  • isUserInteractionEnabled jest właściwością UIView (super klasa UIControl) i nie ma żadnego efektu wizualnego, ale spełnia swój cel

Stosowanie :

myButton.isEnabled = false // Recommended approach

myButton.isUserInteractionEnabled = false // Alternative approach

Czy wiesz, dlaczego otrzymuję ten błąd? Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Otrzymuję również błąd, jeśli zmienię (_ sender: )na UIButton. Błąd brzmi:Value of type '(UIButton) -> ()' has no member 'isEnabled'

0

Powiedzmy, że w Swift 4 masz skonfigurowany przycisk dla segue, IBActionjak ten, @IBAction func nextLevel(_ sender: UIButton) {} i masz inne akcje występujące w Twojej aplikacji (np. Licznik czasu, gra itp.). Zamiast wyłączać przycisk przejścia, możesz chcieć dać użytkownikowi opcję korzystania z tego przejścia, podczas gdy inne działania nadal występują i BEZ AWARII APLIKACJI . Oto jak:

var appMode = 0

@IBAction func mySegue(_ sender: UIButton) {

    if appMode == 1 {  // avoid crash if button pressed during other app actions and/or conditions
        let conflictingAction = sender as UIButton
        conflictingAction.isEnabled = false
    }
}

Pamiętaj, że prawdopodobnie będziesz mieć inne warunki w obrębie if appMode == 0i / lub if appMode == 1które nadal będą występować i NIE będą kolidować z mySegueprzyciskiem. W ten sposób UNIKANIE AWARII .


0

Przycisk można wyłączyć w Swift 4 za pomocą kodu

@IBAction func yourButtonMethodname(sender: UIButon) {
 yourButton.isEnabled = false 
}

Jeśli spróbujesz użyć kodu, powinien wystąpić ten błąd:Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Myślę, że masz na myśli yourButton(sender: UIButton). Zaktualizowany kod prawdopodobnie spowoduje następujący błąd:Value of type '(UIButton) -> ()' has no member 'isEnabled'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.