Tắt một nút


95

Tôi muốn tắt một nút ( UIButton) trên iOS sau khi nó được nhấp vào. Tôi mới phát triển cho iOS nhưng tôi nghĩ mã tương đương trên mục tiêu - C là:

button.enabled = NO;

Nhưng tôi không thể làm điều đó nhanh chóng.

Câu trả lời:


205

Giá trị boolean NOtrong Swift là false.

button.isEnabled = false

Hãy làm nó.

Dưới đây là tài liệu Swift cho UIControl's isEnabledtài sản.


Điều này giống nhau cho dù bạn tạo nút thông qua trình khởi tạo của nó hay thông qua bảng phân cảnh.
KerrM

Ý tôi là khi tôi không có lối thoát. Nhưng dù sao thì giải pháp là xác định nút trên toàn cục.
Daniel Springer

43

Nếu bạn muốn nút ở trạng thái tĩnh mà không xuất hiện "được nhấn":

// Swift 2
editButton.userInteractionEnabled = false 

// Swift 3
editButton.isUserInteractionEnabled = false 

Nhớ lại:

1) Của bạn IBOutletlà ->@IBOutlet weak var editButton: UIButton!

2) Mã trên đi vào viewWillAppear


1
Tôi nghĩ đây chính xác là những gì tôi đang tìm kiếm, nhưng dường như đây chỉ là UIKit, không phải AppKit.
drootang

11

Cách tôi làm như sau:

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

IBAction được kết nối với nút của bạn trong bảng phân cảnh.

Nếu bạn đã thiết lập nút của mình dưới dạng Outlet:

    @IBOutlet weak var myButton: UIButton!

Sau đó, bạn có thể truy cập các thuộc tính đã bật bằng cách sử dụng. ký hiệu trên tên nút:

    myButton.enabled = false

Hoạt động tốt đối với tôi trong Swift 4. Tôi nhận thấy theo mặc định nó đặt người gửi thành Bất kỳ thay vì AnyObject nhưng cả hai vẫn hoạt động .... Bạn đang gặp lỗi gì?
Krivvenz

Để rõ ràng, có lẽ bạn nên nói rõ trong câu trả lời của mình ở trên rằng IBOutlet là cần thiết để mã của bạn hoạt động. Liệu IBOutlet có cần thiết hay không là điều khiến tôi bối rối. Rõ ràng, nó là cần thiết.

Nó không cần thiết để nó hoạt động. Bạn có thể nhập nút cast trong IBAction và thay đổi trạng thái đã bật hoặc nếu bạn đã thiết lập nó làm IBOutlet, bạn có thể thực hiện bằng cách sử dụng .notation trên ổ cắm. Cả hai cách đều hoạt động.
Krivvenz

Tôi tin rằng IBOutlet là cần thiết nếu bạn muốn tắt nút từ bên trong một chức năng khác.


5

Đối với những người Google "vô hiệu hóa một nút" nhưng có thể có nhiều trường hợp sử dụng sắc thái hơn:

Tắt bằng hiệu ứng hình ảnh: Như những người khác đã nói, điều này sẽ ngăn không cho nút được nhấn và hệ thống sẽ tự động làm cho nó trông bị vô hiệu hóa:

yourButton.isEnabled = false 

Tắt mà không có hiệu ứng hình ảnh: Bạn có đang sử dụng một nút trong trường hợp nó trông bình thường nhưng không hoạt động nút thích bằng cách phản ứng với các lần chạm không? Thử cái này!

yourButton.userInteractionEnabled = false

Ẩn mà không vô hiệu hóa: Cách tiếp cận này ẩn nút mà không tắt nó (ẩn nhưng vẫn có thể được khai thác):

 yourButton.alpha = 0.0

Xóa: Thao tác này sẽ xóa hoàn toàn chế độ xem:

 yourButton.removeFromSuperView()

Nhấn vào một cái gì đó phía sau một nút: Có hai nút xếp chồng lên nhau và bạn muốn nút trên cùng tạm thời hoạt động như không có ở đó? Nếu bạn không cần nút trên cùng nữa, hãy xóa nó. Nếu bạn cần lại, hãy thử giảm chiều cao hoặc chiều rộng của nó về 0!


1

Bạn có thể bật / tắt một nút bằng cách sử dụng isEnabledhoặc thuộc isUserInteractionEnabledtính.

Sự khác biệt giữa hai là:

  • isEnabledlà một thuộc tính của UIControl (siêu lớp của UIButton) và nó có các hiệu ứng hình ảnh (tức là chuyển sang màu xám) khi bật / tắt

  • isUserInteractionEnabled là thuộc tính của UIView (siêu cấp UIControl) và không có hiệu ứng hình ảnh mặc dù nhưng đạt được mục đích

Sử dụng :

myButton.isEnabled = false // Recommended approach

myButton.isUserInteractionEnabled = false // Alternative approach

Bạn có biết tại sao tôi gặp lỗi này không? Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Tôi cũng gặp lỗi nếu tôi thay đổi (_ sender: )thành UIButton. Lỗi đọc:Value of type '(UIButton) -> ()' has no member 'isEnabled'

0

Giả sử trong Swift 4, bạn có một nút được thiết lập cho một segue như IBActionthế này @IBAction func nextLevel(_ sender: UIButton) {} và bạn có các hành động khác xảy ra trong ứng dụng của mình (tức là bộ đếm thời gian, trò chơi Play, v.v.). Thay vì vô hiệu hóa nút xác minh, bạn có thể muốn cung cấp cho người dùng tùy chọn sử dụng nút xác định vị trí đó trong khi các hành động khác vẫn đang diễn ra và KHÔNG CÒN XÓA ỨNG DỤNG . Đây là cách thực hiện:

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

Xin lưu ý rằng bạn có thể sẽ có các điều kiện khác bên trong if appMode == 0và / hoặc if appMode == 1điều đó vẫn xảy ra và KHÔNG xung đột với mySeguenút. Như vậy, TRÁNH ĐƯỢC RĂNG .


0

Nút có thể bị vô hiệu hóa trong Swift 4 bằng mã

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

Nếu bạn thử mã của mình, lỗi này sẽ xảy ra:Value of type '(AnyObject) -> ()' has no member 'isEnabled'

Tôi nghĩ bạn có nghĩa là yourButton(sender: UIButton). Mã cập nhật của bạn có thể sẽ gây ra lỗi sau:Value of type '(UIButton) -> ()' has no member 'isEnabled'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.