2015-03-19 17 views
10

Tôi đang cố gắng chuyển UIButton bằng thông tin người dùng của NSTIMer. Tôi đã đọc tất cả các bài viết trên stackoverflow trên NSTimers. Tôi nhận được rất gần nhưng không thể đạt được điều đó. Chủ đề này đã giúpNSTimer người dùng nhanh chóng

Swift NSTimer retrieving userInfo as CGPoint

func timeToRun(ButonToEnable:UIButton) { 
    var tempButton = ButonToEnable 
    timer = NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: Selector("setRotateToFalse"), userInfo: ["theButton" :tempButton], repeats: false)  
} 

chức năng bộ đếm thời gian chạy

func setRotateToFalse() { 
    println( timer.userInfo)// just see whats happening 

    rotate = false 
    let userInfo = timer.userInfo as Dictionary<String, AnyObject> 
    var tempbutton:UIButton = (userInfo["theButton"] as UIButton) 
    tempbutton.enabled = true 
    timer.invalidate()  
} 

Trả lời

24

Tôi nhận thấy bạn đã cố gắng khắc phục điều này nhưng tôi nghĩ tôi sẽ cung cấp cho bạn thêm một chút thông tin về cách sử dụng NSTimer. Cách chính xác để truy cập đối tượng bộ đếm thời gian và do đó thông tin người dùng là sử dụng nó như dưới đây. Khi initialising bộ đếm thời gian, bạn có thể tạo ra nó như thế này:

Swift 2.x

NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: Selector("setRotateToFalse:"), userInfo: ["theButton" :tempButton], repeats: false) 

Swift 3.x <

Timer.scheduledTimer(timeInterval: 1, target: self, selector:#selector(ViewController.setRotateToFalse), userInfo: ["theButton" :tempButton], repeats: false) 

Sau đó gọi lại trông như thế này:

func setRotateToFalse(timer:NSTimer) { 
    rotate = false 
    let userInfo = timer.userInfo as Dictionary<String, AnyObject> 
    var tempbutton:UIButton = (userInfo["theButton"] as UIButton) 
    tempbutton.enabled = true 
    timer.invalidate()  
} 

Do đó bạn không cần phải giữ tham chiếu đến bộ hẹn giờ và tránh các biến toàn cầu thường khó chịu ở nơi khả thi. Bạn có thể gặp vấn đề nhanh chóng nếu lớp của bạn không kế thừa từ NSObject nơi nó nói không có hàm gọi lại được xác định nhưng điều này có thể dễ dàng được sửa bằng cách thêm @objc vào đầu định nghĩa hàm.

+0

Hi nhờ đó là rất hữu ích – user2164327

+0

Không có vấn đề. Bạn có thể đánh dấu câu trả lời khi bạn có một khoảnh khắc không. Chúc mừng –

+1

Ngoài ra, bạn không hoàn toàn phải chuyển từ điển thành 'userInfo', bạn chỉ cần một đối tượng phù hợp với một' AnyObject? '. Cá nhân, tôi đã sử dụng nó để chuyển một chuỗi ' – tfrank377

1

Tôi chỉ sẽ đăng bài này như tôi đọc qua nó trước khi tôi đăng. Tôi nhận thấy rằng tôi đã có timer.invalidate() trước userinfo vì vậy đó là lý do tại sao nó không hoạt động. Tôi sẽ đăng nó vì nó có thể giúp người khác.

func setRotateToFalse(timer:NSTimer) { 
    rotate = false 
    timer.invalidate() 
    let userInfo = timer.userInfo as Dictionary<String, AnyObject> 
    var tempbutton:UIButton = (userInfo["theButton"] as UIButton) 
    tempbutton.enabled = true 
} 
0

MacOS 10.12+ và iOS 10.0+ giới thiệu một khối dựa API của Timer mà là một cách thuận tiện hơn

func timeToRun(buttonToEnable: UIButton) { 
    timer = Timer.scheduledTimer(withTimeInterval:4, repeats: false) { timer in 
     buttonToEnable.enabled = true 
    }  
} 

Một một shot timer sẽ không còn giá trị tự động sau khi nó cháy.


Một cách thuận tiện tương tự cho một một shot timer đang sử dụng GCD (DispatchQueue.main.asyncAfter)

func timeToRun(buttonToEnable: UIButton) { 
    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4)) { 
     buttonToEnable.enabled = true 
    } 
} 
Các vấn đề liên quan