Pole w aplikacji na iOS

głosy
34

Muszę dodać formanty pole wyboru, aby mojego formularza. Wiem, że nie ma takiej kontroli w iOS SDK. Jak mogę to zrobić?

Utwórz 16/03/2009 o 13:05
źródło użytkownik
W innych językach...                            


13 odpowiedzi

głosy
31

zostało to doprowadza mnie do szaleństwa też i znalazłem inne rozwiązanie, które działa dobrze dla mnie i unika konieczności korzystania z obrazów.

  1. Dodaj nowy obiekt etykiety do interfejsu Builder.
  2. Utwórz właściwość IBOutlet w Xcode i podłączyć go do niej. W kodzie poniżej mam nazwał go „fullyPaid” jak chcę wiedzieć, czy ktoś został w pełni opłacony pewną sumę pieniędzy.
  3. Dodaj poniżej funkcje 2. Kontrole funkcja „touchesBegan” jeśli dotknął gdzieś wewnątrz „fullyPaid” etykieta obiektu, a jeśli tak, to wywołuje funkcję „togglePaidStatus”. Funkcja „togglePaidStatus” ustawia dwa ciągi, które mają znaki Unicode reprezentującymi puste pole (\ u2610) i sprawdzane pole (\ u2611), odpowiednio. Następnie porównuje co jest obecnie przedmiotem jest „fullyPaid” i przełącza go z innym ciągiem.

Może chcesz wywołać funkcję togglePaidStatus w funkcji viewDidLoad aby ustawić go na pusty ciąg początkowo.

Oczywiście można dodać dodatkowe kontrole, aby uniemożliwić użytkownikom przełączanie pole wyboru, jeśli etykieta nie jest włączone, ale nie jest pokazany poniżej.

-(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];
}
Odpowiedział 10/04/2010 o 22:23
źródło użytkownik

głosy
26

Ogólnie rzecz biorąc, należy użyć UISwitch dla checkbox podobną funkcjonalność.

Można toczyć własną chociaż stosując kontrolę obrazu z dwóch obrazów (zaznaczone / odznaczone) i przełączania obrazów kiedy dotykają kontroli /

Odpowiedział 16/03/2009 o 13:12
źródło użytkownik

głosy
10

Jeśli przedstawiający grupę opcji, a użytkownik może wybrać jeden z nich, należy użyć tableview z zaznaczenia akcesoriów i innego koloru tekstu na wybranym wierszu.

Jeśli masz jedną opcję, najlepiej jest użyć przełącznika. Jeżeli nie mogą lub nie chcą, użyj przycisku ustawiania normalny obraz na pustym polu i wybranego obrazu w zaznaczone pole. Będziesz musiał dokonać tych dwóch obrazów siebie lub znaleźć grafiki seryjnych użyć do nich.

Odpowiedział 16/03/2009 o 13:33
źródło użytkownik

głosy
8

Rozszerzanie się pomysł Adrean jest , ja to osiągnąć za pomocą bardzo prostego podejścia.
Mój pomysł jest przycisk, aby zmienić (powiedzmy checkBtn) tekst w zależności od jego stanu, a następnie zmienić stan przycisku w jego IBAction.
Poniżej znajduje się kod, jak to zrobiłem w ten sposób:

- (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
    }
}
Odpowiedział 19/03/2014 o 05:17
źródło użytkownik

głosy
6

Oto moja wersja wyboru dla iPhone.

Jest to pojedyncza klasa, która rozciąga UIButton. To jest proste, więc będę go wkleić tutaj.

zawartość pliku CheckBoxButton.h

#import <UIKit/UIKit.h>

@interface CheckBoxButton : UIButton

@property(nonatomic,assign)IBInspectable BOOL isChecked;

@end

zawartość pliku CheckBoxButton.m

#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

Można ustawić obrazy do sprawdzonej / niesprawdzony jak IsChecked właściwości w Inspektorze atrybutu visual studio.

wprowadzić opis obrazu tutaj

Aby dodać CheckBoxButton w serii ujęć lub XIb, proste dodawanie UIButton i Custom klasy jak na następnym obrazie.

wprowadzić opis obrazu tutaj

Przycisk wyśle ​​UIControlEventValueChanged zdarzenie, za każdym razem, gdy IsChecked stan ulegnie zmianie.

Odpowiedział 31/12/2014 o 13:44
źródło użytkownik

głosy
6

Chciałem to zrobić programowo, a także rozwiązać problem, że obszar hitem był naprawdę zbyt małe. To jest dostosowany z różnych źródeł, w tym Mike i Mike'a komentującej Agha.

W nagłówku

@interface YourViewController : UIViewController {
    BOOL checkboxSelected;
    UIButton *checkboxButton;
}

@property BOOL checkboxSelected;;
@property (nonatomic, retain) UIButton *checkboxButton;

-(void)toggleButton:(id)sender;

I w implementacji

// put this in your viewDidLoad method. if you put it somewhere else, you'll probably have to change the self.view to something else
// create the checkbox. the width and height are larger than actual image, because we are creating the hit area which also covers the label
UIButton* checkBox = [[UIButton alloc] initWithFrame:CGRectMake(100, 60,120, 44)];  
[checkBox setImage:[UIImage imageNamed:@"checkbox.png"] forState:UIControlStateNormal];
// uncomment below to see the hit area
// [checkBox setBackgroundColor:[UIColor redColor]];
[checkBox addTarget:self action:@selector(toggleButton:) forControlEvents: UIControlEventTouchUpInside];
// make the button's image flush left, and then push the image 20px left
[checkBox setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[checkBox setImageEdgeInsets:UIEdgeInsetsMake(0.0, 20.0, 0.0, 0.0)];
[self.view addSubview:checkBox];

// add checkbox text text
UILabel *checkBoxLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 74,200, 16)];
[checkBoxLabel setFont:[UIFont boldSystemFontOfSize:14]];
[checkBoxLabel setTextColor:[UIColor whiteColor]];
[checkBoxLabel setBackgroundColor:[UIColor clearColor]];
[checkBoxLabel setText:@"Checkbox"];
[self.view addSubview:checkBox];

// release the buttons
[checkBox release];
[checkBoxLabel release];

I umieścić tę metodę w zbyt:

- (void)toggleButton: (id) sender
{
    checkboxSelected = !checkboxSelected;
    UIButton* check = (UIButton*) sender;
    if (checkboxSelected == NO)
        [check setImage:[UIImage imageNamed:@"checkbox.png"] forState:UIControlStateNormal];
    else
        [check setImage:[UIImage imageNamed:@"checkbox-checked.png"] forState:UIControlStateNormal];

}
Odpowiedział 21/05/2010 o 17:46
źródło użytkownik

głosy
4

Everyones kod tutaj jest bardzo długa, nieco brudny, i można zrobić dużo prostsze. Mam projekt na GitHub że podklasa UIControl, które można pobrać i sprawdzić i daje niemal natywną wyboru elementu UI:

https://github.com/Brayden/UICheckbox

Odpowiedział 18/07/2012 o 08:03
źródło użytkownik

głosy
1

Podklasa UIButton, upuścić przycisk aby kontroler, zaznacz go i zmienić nazwę klasy do CheckBox w Inspektorze tożsamości.

#import "CheckBox.h"

@implementation CheckBox

#define checked_icon @"checked_box_icon.png"
#define empty_icon @"empty_box_icon.png"

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self)
    {
        [self setImage:[UIImage imageNamed:empty_icon] forState:UIControlStateNormal];
        [self addTarget:self action:@selector(didTouchButton) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

- (void)didTouchButton {
    selected = !selected;
    if (selected)
        [self setImage:[UIImage imageNamed:checked_icon] forState:UIControlStateNormal];
    else
        [self setImage:[UIImage imageNamed:empty_icon] forState:UIControlStateNormal];
}

@end
Odpowiedział 13/05/2015 o 11:59
źródło użytkownik

głosy
1

Zrobiłem to z UITextField uniknąć rysunek nic dziwnego, ale lubiłem umieszczenie wewnątrz jako tekst Unicode (Unicode Tick „zaznaczenie” (U + 2713)) dla NSString: @ „u2713 \”.

W ten sposób, w moim pliku .h (implementacji protokołu dla „UITextFieldDelegate” w UITextField):

UITextField * myCheckBox;

W moim viewDidLoad lub funkcji, aby przygotować UI:

...
myCheckBox = [[UITextField alloc] initWithFrame:aFrame];
myCheckBox.borderStyle = UITextBorderStyleRoundedRect; // System look like
myCheckBox.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
myCheckBox.textAlignment = NSTextAlignmentLeft;
myCheckBox.delegate = self;
myCheckBox.text = @" -"; // Initial text of the checkbox... editable!
...

Następnie dodać selektor zdarzeń dla WORZENIE w dotyku imprezy i wywołanie zdarzenia „responseSelected”:

...
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(checkboxSelected)];
[myCheckBox addGestureRecognizer:tapGesture];
...

Wreszcie odpowiedzi do tego selektor

-(void) checkboxSelected
{
    if ([self isChecked])
    {
        // Uncheck the selection
        myCheckBox.text = @" -";
    }else{
       //Check the selection
       myCheckBox.text = @"\u2713";
    }
}

Funkcja „IsChecked” tylko sprawdza, czy tekst jest @ „\ u2713” znacznik wyboru. Aby zapobiec pokazując klawiaturę, gdy pole tekstowe jest wybrany użyć przypadku „textFieldShouldBeginEditing” w UITextField i dodać przełącznik zdarzeń zarządzać wybór:

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // Question selected form the checkbox
    [self checkboxSelected];

    // Hide both keyboard and blinking cursor.
    return NO;
}
Odpowiedział 07/10/2014 o 12:13
źródło użytkownik

głosy
1

w pliku .h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    BOOL isChecked;
    UIImageView * checkBoxIV;
}
@end

I plik .m

- (void)viewDidLoad
{
    [super viewDidLoad];
    isChecked = NO;

    //change this property according to your need
    checkBoxIV = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 15, 15)]; 
    checkBoxIV.image =[UIImage imageNamed:@"checkbox_unchecked.png"]; 

    checkBoxIV.userInteractionEnabled = YES;
    UITapGestureRecognizer *checkBoxIVTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handlecheckBoxIVTapGestureTap:)];
    checkBoxIVTapGesture.numberOfTapsRequired = 1;
    [checkBoxIV addGestureRecognizer:checkBoxIVTapGesture];
}

- (void)handlecheckBoxIVTapGestureTap:(UITapGestureRecognizer *)recognizer {
    if (isChecked) {
        isChecked = NO;
        checkBoxIV.image =[UIImage imageNamed:@"checkbox_unchecked.png"];
    }else{
        isChecked = YES;
        checkBoxIV.image =[UIImage imageNamed:@"checkbox_checked.png"];   
    }
}

Będzie to rade ...

Odpowiedział 14/06/2013 o 11:12
źródło użytkownik

głosy
1

Lubię pomysł Adrian używać znaków zamiast obrazów. Ale nie podoba mi się okno, to musi tylko sama zaznaczenia (@ „u2713 \”). Narysować pole (zaokrąglony) pole programowe i złożyć UILabel zawiera znacznik wewnątrz niego. Ten sposób realizacji ułatwia korzystanie z widoku niestandardowego w dowolnej aplikacji, bez dbałości o dowolnym zasobem zależnej. Można również dostosować kolor zaznaczenia, pole zaokrąglony i tło z łatwością. Oto kompletny kod:

#import <UIKit/UIKit.h>

@class CheckBoxView;

@protocol CheckBoxViewDelegate
- (void) checkBoxValueChanged:(CheckBoxView *) cview;
@end

@interface CheckBoxView : UIView {
    UILabel *checkMark;
    bool isOn;
    UIColor *color;
    NSObject<CheckBoxViewDelegate> *delegate;
}
@property(readonly) bool isOn;
@property(assign) NSObject<CheckBoxViewDelegate> *delegate;

- (void) drawRoundedRect:(CGRect) rect inContext:(CGContextRef) context;
@end



#import "CheckBoxView.h"

#define SIZE 30.0
#define STROKE_WIDTH 2.0
#define ALPHA .6
#define RADIUS 5.0

@implementation CheckBoxView
@synthesize isOn, delegate;

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, SIZE, SIZE)])) {
        // Initialization code
    }
    //UIColor *color = [UIColor blackColor];
    color = [[UIColor alloc] initWithWhite:.0 alpha:ALPHA];

    self.backgroundColor = [UIColor clearColor];
    checkMark = [[UILabel alloc] initWithFrame:CGRectMake(STROKE_WIDTH, STROKE_WIDTH, SIZE - 2 * STROKE_WIDTH, SIZE - 2*STROKE_WIDTH)];
    checkMark.font = [UIFont systemFontOfSize:25.];
    checkMark.text = @"\u2713";
    checkMark.backgroundColor = [UIColor clearColor];
    checkMark.textAlignment = UITextAlignmentCenter;
    //checkMark.textColor = [UIColor redColor];
    [self addSubview:checkMark];
    [checkMark setHidden:TRUE];
    isOn = FALSE;
    return self;
}


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
    CGRect _rect = CGRectMake(STROKE_WIDTH, STROKE_WIDTH, SIZE - 2 * STROKE_WIDTH, SIZE - 2*STROKE_WIDTH);
    [self drawRoundedRect:_rect inContext:UIGraphicsGetCurrentContext()];
    [checkMark setHidden:!isOn];
}


- (void)dealloc {
    [checkMark release];
    [color release];
    [super dealloc];
}

- (void) drawRoundedRect:(CGRect) rect inContext:(CGContextRef) context{
    CGContextBeginPath(context);
    CGContextSetLineWidth(context, STROKE_WIDTH);
    CGContextSetStrokeColorWithColor(context, [color CGColor]);
    CGContextMoveToPoint(context, CGRectGetMinX(rect) + RADIUS, CGRectGetMinY(rect));
    CGContextAddArc(context, CGRectGetMaxX(rect) - RADIUS, CGRectGetMinY(rect) + RADIUS, RADIUS, 3 * M_PI / 2, 0, 0);
    CGContextAddArc(context, CGRectGetMaxX(rect) - RADIUS, CGRectGetMaxY(rect) - RADIUS, RADIUS, 0, M_PI / 2, 0);
    CGContextAddArc(context, CGRectGetMinX(rect) + RADIUS, CGRectGetMaxY(rect) - RADIUS, RADIUS, M_PI / 2, M_PI, 0);
    CGContextAddArc(context, CGRectGetMinX(rect) + RADIUS, CGRectGetMinY(rect) + RADIUS, RADIUS, M_PI, 3 * M_PI / 2, 0);
    CGContextClosePath(context);
    CGContextStrokePath(context);
}

#pragma mark Touch
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint loc = [touch locationInView:self];
    if(CGRectContainsPoint(self.bounds, loc)){
        isOn = !isOn;
        //[self setNeedsDisplay];
        [checkMark setHidden:!isOn];
        if([delegate respondsToSelector:@selector(checkBoxValueChanged:)]){
            [delegate checkBoxValueChanged:self];
        }
    }
}
Odpowiedział 23/07/2010 o 10:41
źródło użytkownik

głosy
0

Zrobiłem jeden niedawno. Swobodnie nabywać od GitHub. Zobacz, czy to pomoże. Efekt jest podobny

wprowadzić opis obrazu tutaj

Odpowiedział 01/04/2019 o 20:36
źródło użytkownik

głosy
0

użytkownik Aruna Lakmal; FYI, po dodaniu tego kodu do IB, jak opisać initWithFrame nie nazywa, initWithCoder jest. Wdrożenie initWithCoder i będzie działać jak możesz opisać.

Odpowiedział 20/01/2013 o 04:15
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more