Dynamic refresh in a view - xcode 4 / MacRuby
I have a label that I have set to blank, and after a user clicks 'go' I generate a random word or number and use: self.label.stringValue = "some_word" to update the view. However, I would like to show 200 or so random words in quick succession before the final one is shown - just because it's too plain at the moment. Alternatively, I'd be happy with showing an animated graphic in its place - which is replaced by the final random word after a few seconds. I've tried things like: 100.times do num = rand(40) self.label.stringValue = num sleep 1 end But it doesn't work. I've also (after googling) tried .reloadData but to no avail as well. Any ideas on how to achieve this? Or pointers on how to add animations to my window/views?
Hi, It doesn't work because you're (probably) blocking the main thread, which is responsible for drawing. What you want to do instead is scheduling a timer inside the main run loop. Look at the NSTimer class. Also, don't forget to force the view to be redrawn, by using the setNeedsDisplay: method. HTH Laurent On Tue, May 24, 2011 at 5:06 PM, azzzz@gmx.net <azzzz@gmx.net> wrote:
I have a label that I have set to blank, and after a user clicks 'go' I generate a random word or number and use:
self.label.stringValue = "some_word"
to update the view.
However, I would like to show 200 or so random words in quick succession before the final one is shown - just because it's too plain at the moment. Alternatively, I'd be happy with showing an animated graphic in its place - which is replaced by the final random word after a few seconds.
I've tried things like:
100.times do num = rand(40) self.label.stringValue = num sleep 1 end
But it doesn't work. I've also (after googling) tried .reloadData but to no avail as well.
Any ideas on how to achieve this? Or pointers on how to add animations to my window/views? _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
Laurent is right and and I think best would be for you to use a NSTimer. def drawWord if !next_word self.timer.invalidate return end self.label.stringValue = next_word self.setNeedsDisplay true end def next_word ... end self.timer = NSTimer.scheduledTimerWithTimeInterval( 1/20.0, target:self, selector:"drawWord:", userInfo:nil, repeats:true) Am 25.05.2011 um 02:06 schrieb azzzz@gmx.net:
I have a label that I have set to blank, and after a user clicks 'go' I generate a random word or number and use:
self.label.stringValue = "some_word"
to update the view.
However, I would like to show 200 or so random words in quick succession before the final one is shown - just because it's too plain at the moment. Alternatively, I'd be happy with showing an animated graphic in its place - which is replaced by the final random word after a few seconds.
I've tried things like:
100.times do num = rand(40) self.label.stringValue = num sleep 1 end
But it doesn't work. I've also (after googling) tried .reloadData but to no avail as well.
Any ideas on how to achieve this? Or pointers on how to add animations to my window/views?
-- Thomas R. "TomK32" Koll, Ruby/Rails freelancer http://ananasblau.com | http://github.com/TomK32
Just as an extra FYI, you are indeed blocking the main thread by using `sleep 1`, which is a synchronous call and thus in that one second no other code on the same thread will have a chance to update your views. On Wed, May 25, 2011 at 7:50 AM, Thomas R. Koll <info@ananasblau.com> wrote:
Laurent is right and and I think best would be for you to use a NSTimer.
def drawWord if !next_word self.timer.invalidate return end self.label.stringValue = next_word self.setNeedsDisplay true end
def next_word ... end
self.timer = NSTimer.scheduledTimerWithTimeInterval( 1/20.0, target:self, selector:"drawWord:", userInfo:nil, repeats:true)
Am 25.05.2011 um 02:06 schrieb azzzz@gmx.net:
I have a label that I have set to blank, and after a user clicks 'go' I generate a random word or number and use:
self.label.stringValue = "some_word"
to update the view.
However, I would like to show 200 or so random words in quick succession before the final one is shown - just because it's too plain at the moment. Alternatively, I'd be happy with showing an animated graphic in its place - which is replaced by the final random word after a few seconds.
I've tried things like:
100.times do num = rand(40) self.label.stringValue = num sleep 1 end
But it doesn't work. I've also (after googling) tried .reloadData but to no avail as well.
Any ideas on how to achieve this? Or pointers on how to add animations to my window/views?
-- Thomas R. "TomK32" Koll, Ruby/Rails freelancer http://ananasblau.com | http://github.com/TomK32
_______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
Just one minor detail, the NSTimer callback method accepts an argument (which is a reference to the NSTimer object). So it should be: def drawWord(sender) … end If it works otherwise, then it's pure luck :) Laurent On May 24, 2011, at 10:50 PM, Thomas R. Koll wrote:
Laurent is right and and I think best would be for you to use a NSTimer.
def drawWord if !next_word self.timer.invalidate return end self.label.stringValue = next_word self.setNeedsDisplay true end
def next_word ... end
self.timer = NSTimer.scheduledTimerWithTimeInterval( 1/20.0, target:self, selector:"drawWord:", userInfo:nil, repeats:true)
Am 25.05.2011 um 02:06 schrieb azzzz@gmx.net:
I have a label that I have set to blank, and after a user clicks 'go' I generate a random word or number and use:
self.label.stringValue = "some_word"
to update the view.
However, I would like to show 200 or so random words in quick succession before the final one is shown - just because it's too plain at the moment. Alternatively, I'd be happy with showing an animated graphic in its place - which is replaced by the final random word after a few seconds.
I've tried things like:
100.times do num = rand(40) self.label.stringValue = num sleep 1 end
But it doesn't work. I've also (after googling) tried .reloadData but to no avail as well.
Any ideas on how to achieve this? Or pointers on how to add animations to my window/views?
-- Thomas R. "TomK32" Koll, Ruby/Rails freelancer http://ananasblau.com | http://github.com/TomK32
_______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
Hey guys - thanks for the tips. I must be really thick as I couldn't get it to work.... but... I managed to work something out by just creating a new thread for the loop - and it seems to be working ok *grin* Thanks again for your help! Aston On 25 May 2011, at 21:28, Laurent Sansonetti wrote:
Just one minor detail, the NSTimer callback method accepts an argument (which is a reference to the NSTimer object). So it should be:
def drawWord(sender) … end
If it works otherwise, then it's pure luck :)
Laurent
On May 24, 2011, at 10:50 PM, Thomas R. Koll wrote:
Laurent is right and and I think best would be for you to use a NSTimer.
def drawWord if !next_word self.timer.invalidate return end self.label.stringValue = next_word self.setNeedsDisplay true end
def next_word ... end
self.timer = NSTimer.scheduledTimerWithTimeInterval( 1/20.0, target:self, selector:"drawWord:", userInfo:nil, repeats:true)
Am 25.05.2011 um 02:06 schrieb azzzz@gmx.net:
I have a label that I have set to blank, and after a user clicks 'go' I generate a random word or number and use:
self.label.stringValue = "some_word"
to update the view.
However, I would like to show 200 or so random words in quick succession before the final one is shown - just because it's too plain at the moment. Alternatively, I'd be happy with showing an animated graphic in its place - which is replaced by the final random word after a few seconds.
I've tried things like:
100.times do num = rand(40) self.label.stringValue = num sleep 1 end
But it doesn't work. I've also (after googling) tried .reloadData but to no avail as well.
Any ideas on how to achieve this? Or pointers on how to add animations to my window/views?
-- Thomas R. "TomK32" Koll, Ruby/Rails freelancer http://ananasblau.com | http://github.com/TomK32
_______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
_______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
participants (5)
-
azzzz@gmx.net
-
Eloy Duran
-
Laurent Sansonetti
-
Laurent Sansonetti
-
Thomas R. Koll