Вимкніть кнопку


95

Я хочу відключити кнопку ( UIButton) на iOS після натискання. Я новачок у розробці для iOS, але я думаю, що еквівалентний код за ціллю - C такий:

button.enabled = NO;

Але я не міг зробити це швидко.

Відповіді:


206

Логічне значення для NOSwift дорівнює false.

button.isEnabled = false

повинен це зробити.

Ось це документація Swift для UIControl«S isEnabledвласності.


Те саме, чи створили ви кнопку за допомогою її ініціалізатора або за допомогою розкадрувань.
KerrM

Я мав на увазі, коли у мене немає торгової точки. У будь-якому випадку рішення полягає у визначенні кнопки глобально.
Даніель Спрінгер

43

Якщо ви хочете, щоб кнопка залишалася статичною, не маючи зовнішнього вигляду:

// Swift 2
editButton.userInteractionEnabled = false 

// Swift 3
editButton.isUserInteractionEnabled = false 

Пам'ятайте:

1) Ваш IBOutlet->@IBOutlet weak var editButton: UIButton!

2) Код вище входить viewWillAppear


1
Я думав, що це саме те, що я шукав, але, схоже, це лише UIKit, а не AppKit.
drootang

11

Я роблю це наступним чином:

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

IBAction підключений до вашої кнопки в раскадровці.

Якщо ви налаштували кнопку як розетку:

    @IBOutlet weak var myButton: UIButton!

Тоді ви зможете отримати доступ до включених властивостей за допомогою. позначення назви кнопки:

    myButton.enabled = false

Мені добре працює у Swift 4. Я зауважив, що за замовчуванням він встановлює для відправника значення Any замість AnyObject, але обидва все одно працюють .... Яку помилку ви отримуєте?
Криввенц

Для наочності, можливо, ви повинні вказати у своїй відповіді вище, що IBOutlet необхідний для роботи вашого коду. Чи потрібен був IBOutlet, це мене бентежило. Очевидно, що це потрібно.

Це не потрібно для його роботи. Ви можете ввести кнопку "Привести" в IBAction і змінити статус увімкненого, або якщо він налаштований як IBOutlet, ви можете зробити це за допомогою .notation на розетці. Обидва способи працюють.
Криввенц

Я впевнений, що IBOutlet потрібен, якщо ви хочете відключити кнопку з іншої функції.


5

Для тих, хто погуглив "вимкнути кнопку", але може мати більше нюансів використання:

Вимкнути за допомогою візуального ефекту: Як казали інші, це не дозволить натискати кнопку, і система автоматично зробить її вимкненою:

yourButton.isEnabled = false 

Вимкнути без візуального ефекту: чи використовуєте ви кнопку у випадку, коли вона повинна виглядати нормально, але не поводитись кнопкою "подобається", реагуючи на дотики? Спробуйте це!

yourButton.userInteractionEnabled = false

Приховати без відключення: Цей підхід приховує кнопку, не відключаючи її (невидимий, але все ще можна натиснути):

 yourButton.alpha = 0.0

Видалити: Це повністю видалить подання:

 yourButton.removeFromSuperView()

Натисніть щось за кнопкою: маєте дві кнопки складеними, і ви хочете, щоб верхня кнопка тимчасово діяла так, ніби її немає? Якщо вам знову не знадобиться верхня кнопка, видаліть її. Якщо він вам знадобиться ще раз, спробуйте ущільнити його висоту або ширину до 0!


1

Ви можете ввімкнути / вимкнути кнопку за допомогою isEnabledабо isUserInteractionEnabledвластивості.

Різниця між двома:

  • isEnabledє властивістю UIControl (супер клас UIButton), і він має візуальні ефекти (тобто сірий) увімкнення / вимкнення

  • isUserInteractionEnabled є властивістю UIView (супер клас UIControl) і не має візуального ефекту, хоча досягає мети

Використання:

myButton.isEnabled = false // Recommended approach

myButton.isUserInteractionEnabled = false // Alternative approach

Чи знаєте ви, чому я отримую цю помилку? Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Я також отримую повідомлення про помилку, якщо переходжу (_ sender: )на UIButton. Помилка звучить так:Value of type '(UIButton) -> ()' has no member 'isEnabled'

0

Скажімо, у Swift 4 у вас є кнопка, налаштована на сегу як IBActionподібну, @IBAction func nextLevel(_ sender: UIButton) {} і у вас є інші дії, що відбуваються у вашому додатку (тобто таймер, gamePlay тощо). Замість того, щоб відключити кнопку segue, ви можете надати користувачеві можливість використовувати цю segue, поки інші дії все ще відбуваються і БЕЗ ЗБІВАННЯ ДОДАТКА . Ось як:

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
    }
}

Зверніть увагу, що у вас, ймовірно, будуть інші умови всередині if appMode == 0та / або if appMode == 1які все ще будуть виникати, і НЕ конфліктуватимуть з mySegueкнопкою. Таким чином, УНИКНЕННЯ КОРОТКИ .


0

Кнопку можна відключити в Swift 4 за допомогою коду

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

Якщо ви спробуєте свій код, має статися ця помилка:Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Гадаю, ти маєш на увазі yourButton(sender: UIButton). Ваш оновлений код, швидше за все, спричинить таку помилку:Value of type '(UIButton) -> ()' has no member 'isEnabled'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.