Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

Zliczanie ilości kliknięć w przycisk Cocoa


  • Zaloguj się, aby dodać odpowiedź
12 odpowiedzi w tym temacie

#1 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 06 czerwca 2013 - 20:53

Witam Wie ktoś jak zliczać ilość kliknięć w przycisk ? Normalnie po kliknięciu przycisku wywołuje się kod i jest ok, co prawda nie odświeża się ale mniejsza z tym. Najważniejsze póki co to sposób na odwołanie się do licznika wciśnięć, nie wiem jakaś zmienna statyczna czy coś w tym stylu za cholere nie wiem jak się za to zabrać a w sieci nic nie ma :(

#2 wojtkow

wojtkow


  • 6 767 postów
  • Płeć:
  • SkądPoznań

Napisano 06 czerwca 2013 - 20:56

Może najpierw napisz do czego chcesz wykorzystać zliczoną ilość wciśnięć, to łatwiej będzie coś doradzić. I zapomnij o zmiennych statycznych, je powinno się wykorzystywać tylko w określonych, bardzo specyficznych przypadkach.

#3 riodro1

riodro1
  • 136 postów
  • SkądDzierżoniów, Poland

Napisano 07 czerwca 2013 - 00:20

Zrób podklasę NSButton i zadeklaruj w niej właściwość licznik, czy cokolwiek jako jakiś integer. Nadpisz w pliku .m metodę
-(void)mouseDown:(NSEvent*)theEvent
{
licznik++;
[super mouseDown:theEvent];
}

do wartości odwołujesz się z poziomu tego obiektu zadeklarowanego w IB

#4 Roberto

Roberto
  • 13 752 postów
  • SkądWrocław

Napisano 07 czerwca 2013 - 08:50

jakoś subklasowanie buttona w tym celu nie wydaje mi się najmądrzejszym podejściem, skoro i tak mamy metodę 'obsługującą' kliknięcie 'na zewnątrz' i wystarczyłoby zrobić chociażby NSDictionary z kluczem id buttona, a wartością NSNumber - to bardziej mi pasuje do kontrolera niż do samego buttona. Swoją drogą - coś takiego chyba nie liczyłoby kliknięć 'klawiaturowych', czy się mylę? Chyba że chodzi o clickcount w evencie wysyłanym do buttona.

#5 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 07 czerwca 2013 - 17:00

Dzięki za pomoc, niestety poległem. Zagadnienie wydawało się proste ale jak wiadomo w obj-c nic nie jest proste. Ale chyba jest możliwość wysłania zwrotnego z obiektu do przycisku, jeśli tak, to można by wysłać zmienną liczbową do buttona po powtórnym naciśnięciu zmienna by się zinkrementowała. Ale tutaj pewnie przekombinowałem.

#6 Roberto

Roberto
  • 13 752 postów
  • SkądWrocław

Napisano 07 czerwca 2013 - 22:43

W Cocoa masa rzeczy jest pięknie banalna, jak się wie co się robi i robi to zgodnie ze sztuką.
Dodać obiekt do Interface Buildera, podłączyć akcję i wsio.

@interface AppController : NSObject

@property (assign) NSInteger counter;

- (IBAction)buttonClicked:(NSButton *)sender;

@end

@implementation AppController

@synthesize counter = _counter;

- (IBAction)buttonClicked:(NSButton *)sender {
	NSLog(@"%ld", ++self.counter);
}

@end

jak ma być więcej buttonów to wystarczy dodać NSDictionary, żeby trzymał te wartości.
@interface AppController : NSObject

@property (nonatomic, strong) NSMutableDictionary *counter;

- (IBAction)buttonClicked:(NSButton *)sender;

@end

@implementation AppController

@synthesize counter = _counter;

- (IBAction)buttonClicked:(NSButton *)sender {
	NSNumber *value = [self.counter objectForKey:sender.description];
	if (value == nil) {
		value = [NSNumber numberWithInteger:0];
	}
	value = [NSNumber numberWithInteger:value.integerValue+1];
	[self.counter setObject:value forKey:sender.description];
	NSLog(@"%@ %@", sender, value);
}

- (NSMutableDictionary *)counter
{
	if (_counter == nil) {
		_counter = [[NSMutableDictionary alloc] init];
	}
	return _counter;
}

@end

proste, eleganckie, wygodne. Cocoa ;)

#7 metal_man

metal_man
  • 489 postów
  • SkądChorzów

Napisano 08 czerwca 2013 - 08:26

jak ma być więcej buttonów to wystarczy dodać NSDictionary, żeby trzymał te wartości.


A nie wystarczy zadeklarować czegoś takiego:

@property (strong, nonatomic) NSInteger counter;

Wtedy wartość zostaje przytrzymana i nie będzie zwolniona.

#8 Roberto

Roberto
  • 13 752 postów
  • SkądWrocław

Napisano 08 czerwca 2013 - 09:08

metal_man - jak ma być więcej buttonów, to każdy z nich powinien mieć chyba swój licznik? Jedna zmienna więc nie starczy. No chyba, że mają mieć wspólny licznik. Nie mniej - strong 'nie działa' z NSInteger, bo NSInteger nie jest obiektem (to jest zunifikowany int/long w zależności od bitowości komputera/systemu) - powinno być assign, bo to typ prymitywny.

#9 wojtkow

wojtkow


  • 6 767 postów
  • Płeć:
  • SkądPoznań

Napisano 08 czerwca 2013 - 09:12

Ale to będzie jedna wartość dla wszystkich przycisków. Jeżeli chcesz osobno trzymać wartość każdego przycisku to musisz użyć albo NSDictionary, albo NSArray, albo multiplikować zmienne counter, co ma najmniejszy sens.

#10 metal_man

metal_man
  • 489 postów
  • SkądChorzów

Napisano 08 czerwca 2013 - 10:00

odebrałem to jako jeden licznik ;) Dla większej ilości to oczywiście słownik albo tablica. No tak, zamiast strong lepiej użyć retain i będzie po kłopocie. :)

#11 wojtkow

wojtkow


  • 6 767 postów
  • Płeć:
  • SkądPoznań

Napisano 08 czerwca 2013 - 13:22

retain też nie możesz użyć, bo NSInteger nie jest obiektem (więc nie można zliczać retain count).

#12 Roberto

Roberto
  • 13 752 postów
  • SkądWrocław

Napisano 08 czerwca 2013 - 17:31

no i albo strong albo retain - w zależności czy korzystamy z ARC czy nie.

#13 metal_man

metal_man
  • 489 postów
  • SkądChorzów

Napisano 08 czerwca 2013 - 22:15

Erm... Chyba jeszcze z wakacji nie wrocilem...




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych