36 Stimmen

Kontrollkästchen in iOS-Anwendung

Ich muss Kontrollkästchen Steuerelemente zu meinem Formular hinzufügen. Ich weiß, dass es kein solches Steuerelement in iOS SDK gibt. Wie könnte ich das tun?

32voto

Adrian Punkte 491

Das hat mich auch in den Wahnsinn getrieben, und ich habe eine andere Lösung gefunden, die für mich gut funktioniert, ohne dass ich Bilder verwenden muss.

  1. Fügen Sie dem Interface Builder ein neues Etikettenobjekt hinzu.
  2. Erzeugen Sie eine IBOutlet-Eigenschaft in Xcode und verbinden Sie sie mit ihr. Im folgenden Code habe ich sie "fullyPaid" genannt, da ich wissen möchte, ob jemand eine Geldsumme vollständig bezahlt hat.
  3. Fügen Sie die 2 folgenden Funktionen hinzu. Die Funktion "touchesBegan" prüft, ob Sie irgendwo innerhalb des "fullyPaid"-Etikettenobjekts berührt haben, und wenn ja, ruft sie die Funktion "togglePaidStatus" auf. Die Funktion 'togglePaidStatus' erstellt zwei Strings, die die Unicode-Zeichen enthalten, die ein leeres Feld darstellen ( \u2610 ) und ein angekreuztes Kästchen ( \u2611 ). Dann vergleicht es den aktuellen Inhalt des "fullyPaid"-Objekts und tauscht ihn mit dem anderen String aus.

Möglicherweise möchten Sie die Funktion togglePaidStatus in der Funktion viewDidLoad aufrufen, um sie zunächst auf eine leere Zeichenfolge zu setzen.

Natürlich können Sie zusätzliche Kontrollen hinzufügen, um zu verhindern, dass Benutzer das Kontrollkästchen umschalten, wenn das Etikett nicht aktiviert ist, aber das wird hier nicht gezeigt.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];   
    if (CGRectContainsPoint([fullyPaid frame], [touch locationInView:self.view]))
    {
        [self togglePaidStatus];
    }
}
-(void) togglePaidStatus
{
    NSString *untickedBoxStr = [[NSString alloc] initWithString:@"\u2610"];
    NSString *tickedBoxStr = [[NSString alloc] initWithString:@"\u2611"];   

    if ([fullyPaid.text isEqualToString:tickedBoxStr])
    {
        fullyPaid.text = untickedBoxStr;
    }
    else
    {
        fullyPaid.text = tickedBoxStr;
    }

    [tickedBoxStr release];
    [untickedBoxStr release];
}

1 Stimmen

Dieser Ansatz gefällt mir wirklich sehr gut. Es ist toll, dass man keine Grafiken verwenden muss. Aber die leeren und die angekreuzten Kästchen sehen sich nicht sehr ähnlich, sie sind sogar ziemlich unpassend. Gibt es eine Möglichkeit, das zu ändern?

25voto

Eric Petroelje Punkte 58501

Im Allgemeinen verwenden Sie den UISwitch für checkbox-ähnliche Funktionen.

Sie könnten aber auch Ihre eigene Lösung finden, indem Sie eine Bildsteuerung mit zwei Bildern (markiert/unmarkiert) verwenden und die Bilder umschalten, wenn sie die Steuerung berühren/

0 Stimmen

Könnten Sie näher erläutern, wie man den Bildwechsel durchführt? Danke!

3 Stimmen

Virtuelles -1 an yar für "+1 für die Nichtausarbeitung"; virtuelles -1 an vladimir mitrovic für "-1 für die Nichtausarbeitung" :)

26 Stimmen

+(1-i) zu LolaRun für die Virtualisierung.

14voto

Becca Royal-Gordon Punkte 17031

Wenn Sie eine Gruppe von Optionen anzeigen und der Benutzer eine davon auswählen kann, verwenden Sie eine Tabellenansicht mit einem zusätzlichen Häkchen und einer anderen Textfarbe für die ausgewählte Zeile.

Wenn Sie nur eine einzige Möglichkeit haben, ist es am besten, einen Schalter zu verwenden. Wenn Sie das nicht können oder wollen, verwenden Sie eine Schaltfläche, die das normale Bild als leeres Kästchen und das ausgewählte Bild als markiertes Kästchen darstellt. Sie müssen diese beiden Bilder selbst erstellen oder eine Standardgrafik finden, die Sie dafür verwenden können.

9voto

S1LENT WARRIOR Punkte 11174

Ausdehnung auf Adreans Idee Ich habe dies mit einem sehr einfachen Ansatz erreicht.
Meine Idee ist es, die Schaltfläche (sagen wir checkBtn ), und ändern Sie dann den Zustand der Schaltfläche in ihrem IBAction .
Unten ist der Code, wie ich das gemacht habe:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [checkBtn setTitle:@"\u2610" forState:UIControlStateNormal];    // uncheck the button in normal state
    [checkBtn setTitle:@"\u2611" forState:UIControlStateSelected];  // check the button in selected state
}

- (IBAction)checkButtonTapped:(UIButton*)sender {
    sender.selected = !sender.selected;    // toggle button's selected state  

    if (sender.state == UIControlStateSelected) {    
        // do something when button is checked 
    } else {
        // do something when button is unchecked
    }
}

0 Stimmen

Leider, wie in Adrians Idee erwähnt, sieht der Off-State-Charakter ziemlich daneben aus :-/

6voto

slobodans Punkte 841

Hier ist meine Version der Checkbox für das iPhone.

Es ist eine einzelne Klasse, die UIButton erweitert. Es ist einfach, so werde ich es hier einfügen.

Inhalt der Datei CheckBoxButton.h

#import <UIKit/UIKit.h>

@interface CheckBoxButton : UIButton

@property(nonatomic,assign)IBInspectable BOOL isChecked;

@end

CheckBoxButton.m Datei Inhalt

#import "CheckBoxButton.h"

@interface CheckBoxButton()

@property(nonatomic,strong)IBInspectable UIImage* checkedStateImage;
@property(nonatomic,strong)IBInspectable UIImage* uncheckedStateImage;

@end

@implementation CheckBoxButton

-(id)init
{
    self = [super init];

    if(self)
    {
        [self addTarget:self action:@selector(switchState) forControlEvents:UIControlEventTouchUpInside];
    }

    return self;
}

-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    if(self)
    {
        [self addTarget:self action:@selector(switchState) forControlEvents:UIControlEventTouchUpInside];
    }

    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if(self)
    {
        [self addTarget:self action:@selector(switchState) forControlEvents:UIControlEventTouchUpInside];
    }

    return self;
}

-(void)setIsChecked:(BOOL)isChecked
{
    _isChecked = isChecked;

    if(isChecked)
    {
        [self setImage:self.checkedStateImage forState:UIControlStateNormal];
    }
    else
    {
        [self setImage:self.uncheckedStateImage forState:UIControlStateNormal];
    }
}

-(void)switchState
{
    self.isChecked = !self.isChecked;
    [self sendActionsForControlEvents:UIControlEventValueChanged];
}

@end

Sie können Bilder für checked/unchecked sowie die isChecked-Eigenschaft im Attributinspektor von Visual Studio festlegen.

enter image description here

Um CheckBoxButton in Storyboard oder xib hinzuzufügen, fügen Sie einfach UIButton und benutzerdefinierte Klasse wie auf dem nächsten Bild.

enter image description here

Die Schaltfläche sendet das Ereignis UIControlEventValueChanged jedes Mal, wenn der Status von isChecked geändert wird.

0 Stimmen

Großartige Antwort, weil es gut mit Storyboard funktioniert, so dass es viel Positionierungscode vermeidet (und nur sauberen Code hinterlässt) und ich in der Lage bin, benutzerdefinierte Bilder zu verwenden. Auch schön erklärt, so dass für einen Neuling zu iOS wie mich dies einfach zu implementieren ist. Jetzt um herauszufinden, warum meine Bilder in blau wie der Text auf der Schaltfläche erscheinen...

0 Stimmen

Ok, um zu vermeiden, dass Ihr Bild unter iOS 7+ blau eingefärbt wird, setzen Sie die Eigenschaft Typ auf Benutzerdefiniert, wie Sie im ersten Screenshot von @slobodans' Antwort sehen können, aber ich habe die Antwort von hier: stackoverflow.com/a/21313338/1479962

0 Stimmen

Beste Antwort! Die Schaltfläche IBDesignable zu machen ist ein toller Bonus!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X