2014-10-14 19 views
20

Tôi đang làm cho một lớp con UIButton trong Swift để thực hiện bản vẽ tùy chỉnh và hình ảnh động về lựa chọnSwift - UIButton trọng setSelected

Điều gì sẽ là tương đương trong Swift của trọng - (void)setSelected:(BOOL)selected trong ObjC?

tôi đã cố gắng

override var selected: Bool

vì vậy tôi có thể thực hiện một quan sát viên nhưng tôi nhận

Cannot override with a stored property 'selected'

Trả lời

47

Giống như những người khác được đề cập bạn có thể sử dụng willSet để phát hiện thay đổi. Tuy nhiên, trong ghi đè, bạn không cần gán giá trị cho siêu, bạn chỉ đang quan sát thay đổi hiện tại.

Một vài điều bạn có thể quan sát từ sân chơi sau:

  1. Trọng tài sản cho willSet/didSet vẫn gọi siêu cho get/set. Bạn có thể biết vì trạng thái thay đổi từ .normal thành .selected.
  2. willSet và didSet được gọi là ngay cả khi giá trị không thay đổi, vì vậy bạn có thể sẽ muốn làm so sánh giá trị của selected hoặc là newValue trong willSet hay oldValue trong didSet để xác định có hay không để animate.
import UIKit 

class MyButton : UIButton { 

    override var isSelected: Bool { 
     willSet { 
      print("changing from \(isSelected) to \(newValue)") 
     } 

     didSet { 
      print("changed from \(oldValue) to \(isSelected)") 
     } 
    } 
} 

let button = MyButton() 

button.state == .normal 
button.isSelected = true // Both events fire on change. 
button.state == .selected 
button.isSelected = true // Both events still fire. 
+2

Trong ** SWIFT3 ** 'selected' đã được đã đổi tên thành 'isSelected' ... Vui lòng cập nhật :) – Husam

+0

@Husam Cập nhật. :) –

0

thử này

override public var selected: Bool { 
    willSet(selectedValue) { 
     self.selected = selectedValue 
     // Do whatever you want 
    } 
} 
+0

Xcode cho tôi cảnh báo và đề xuất thay thế công khai bằng nội bộ. Bạn có thể giải thích tại sao từ khóa nội bộ là cần thiết không? Cảm ơn. – LorTush

+0

Sử dụng nội bộ bạn đang nói rằng bạn có thể truy cập vào var từ cùng một mô-đun. Bạn có thêm thông tin ở đây: http://www.codingricky.com/access-control-in-swift/ Hy vọng nó sẽ giúp :) – diegomen

6

bạn muốn làm điều đó như ví dụ này:

class MyButton : UIButton { 

    // ... 

    override var isSelected: Bool { 
     willSet(newValue) { 
      super.isSelected = newValue; 
      // do your own business here... 
     } 
    } 

    // ... 

} 
+0

Ok điều này hoạt động ngay cả khi không có từ khóa công cộng/nội bộ như đề xuất bởi diegomen. Tôi đã nhận được lỗi vì tôi chưa bao gồm {} với người quan sát, ngớ ngẩn tôi ... Nhưng tôi vẫn không hiểu tại sao họ lại bắt buộc ... – LorTush

0

Tạo IBAction và kiểm tra nút chọn hay không bằng ngôn ngữ nhanh chóng.

@IBAction func favoriteButtonAction(sender: UIButton) { 

    // Save Data 
    sender.selected = !sender.selected; 

    if (sender.selected) 
    { 
     NSLog(" Not Selected"); 
    } 
    else 
    { 
     NSLog(" Selected"); 
    } 

} 
Các vấn đề liên quan