2012-10-10 6 views
21

Jestem bardzo nowy na iOS, więc oczywiście brakuje mi kilku pomysłów, próbując podążać za tym rozwiązaniem Display datepicker on tapping on textfield do mojego problemu.Pokaż datepicker na pasku tekstowym wybierz

mam interfejs i wdrożenia w klasie o nazwie DatepickerAppDelegate, ale gubię się tutaj:

„W XIB, wyciągnąć UIToolbar i UIDatePicker ale nie dołączyć go do widoku. Podłącz odpowiednio gniazdka dataChanged: reaguje na zmiany w selektorze daty i doneEdycja: jest wywoływana po kliknięciu przycisku Gotowe na pasku narzędzi.Połącz je też.Wykonanie metod zostało przedstawione poniżej. "

Przeczytałem coś o XIB, ale używam storyboardu, więc myślę, że nie mam wtedy. Ponadto nie jestem pewien, jak mam wyciągnąć elementy bez dołączania ich do kontrolerów widoku (próbuję, ale kiedy zwalniam przycisk myszy, narzędzie leci z powrotem do paska narzędzi), a ja nie Nawet rozumiem, dlaczego potrzebuję paska UIToolbar.

Na koniec, w jaki sposób mogę połączyć moje pole tekstowe z delegatem datepicker?

Czy ktoś może mi pomóc?

UPDATE:

w rzeczywistości jest to bardzo proste, po prostu trzeba:

datePicker = [[UIDatePicker alloc] init]; 
datePicker.datePickerMode = UIDatePickerModeDate; 
[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged]; 

self.birthday.inputView = datePicker; 

Odpowiedz

51

UIResponder, z którego UITextField dziedziczy, defines a property called inputView. Ta właściwość (UIView *) może definiować widok, który będzie wyświetlany jako zamiast klawiatury, gdy ta UIResponder stanie się pierwszą odpowiedzią.

Tak więc, jeśli chcesz UIDatePicker pojawiać się po stuknięciu w pole tekstowe (czyli zrobić to textField pierwszy responder), to można powiedzieć, naiwnie:

UIDatePicker *datePicker = [[UIDatePicker alloc] init...]; 
... configure datePicker ... 

[myTextField setInputView:datePicker]; 

Teraz, kiedy swoją UITextField jest podsłuchiwany, zamiast tego pojawi się UIDatePicker.

JEDNAK

Będziemy chcieli zrobić coś więcej niż to, ponieważ trzeba będzie obsługiwać różne kierunki i różne idiomy.

Ale to jest podstawowy pomysł.

(i jeśli chcesz pasku narzędzi nad UIDatePicker, że to, co jest na własność inputAccessoryView ...)

+0

To jest dokładnie to, co zrobiłem, ale nie pamiętam, aby zaktualizować wpis. – lolol

+0

Napisałem klasę open source, [STADateField] (https://github.com/Stunner/STAControls/blob/master/STAControls/STAControls/TextField/STADateField.h), na podstawie tej odpowiedzi. – Stunner

0

Dodawanie widoku datepicker i uitoolbarview do widzenia. Na przykład

CGFloat toolbarHeight = 44.f; 
CGFloat datePickerHeight = 140.f; 
CGFloat containerViewHeight = toolbarHeight+datePickerHeight; 
//create container view for datepicker and toolbar 
UIView *containerView = [[UIVIew alloc] initWithFrame:CGRectMake(0.f, [self.view bounds].size.height+containerViewHeight, [self.view bounds].size.width, containerViewHeight)]; 

//after init toolbar set the frame 
toolBar.frame = CGRectMake(0.f,0.f,containerView.frame.size.width, toolbarHeight]; 
//then add on toolbar button save and release it after add 

//after init datePicker set the frame 
datePicker.frame = CGRectMake(0.f, toolbarHeight, containerView.frame.size.width, datePickerHeight); 

//add datePicker and toolBar to containerView 
[containerView addSubview: toolBar]; 
[containerView addSubview: datePicker]; 

[toolBar release]; 
[datePicker release]; 

//add containerView to main view 

[self.view addSubview: containerView]; 
[containerView release]; 

Więc kiedy widok zrobił obciążenia są one będą ukryte Y widzenia contener jest poza twoim zdaniem ramy.

Teraz należy przypisać delegata własnością UITextFieldDelegate

textfield.delegate = self; 

W sposobie delegat textFieldDidBeginEditing zobaczyć UITextFieldDelegate należy odpalić metodę, która pokaże swoje datepicker i pasek narzędzi. Jeśli masz wiele pól tekstowych do zdefiniowania, który został wybrany, użyj wartości znacznik, która jest liczbą całkowitą i możesz użyć przełącznika zamiast zamiast wielu warunków , jeśli.

Aby pokazać datePicker i pasek narzędzi, należy zmienić Y ramki containerView. Oto jak to zrobić

CGRect containerViewFrame = containerView.frame; 
containerViewFrame.y -=containerViewHeight; 
containerView.frame = containerViewFrame; 

Aby ukryć tylko plus zmienną containerViewHeight. Możesz użyć UIViewAnimations, aby pokazać go z pewną animacją. Na przykład UIViewAnimationCurveEaseInOut

20

W viewDidLoad zViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIDatePicker *datePicker = [[UIDatePicker alloc]init]; 
    [datePicker setDate:[NSDate date]]; 
    datePicker.datePickerMode = UIDatePickerModeDate; 
    [datePicker addTarget:self action:@selector(dateTextField:) forControlEvents:UIControlEventValueChanged]; 
    [txtFieldBranchYear setInputView:datePicker]; 
} 

Dodaj jeden metoda w swoim ViewController

-(void) dateTextField:(id)sender 
{ 
    UIDatePicker *picker = (UIDatePicker*)txtFieldBranchYear.inputView; 
    [picker setMaximumDate:[NSDate date]]; 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    NSDate *eventDate = picker.date; 
    [dateFormat setDateFormat:@"dd/MM/yyyy"]; 

    NSString *dateString = [dateFormat stringFromDate:eventDate]; 
    txtFieldBranchYear.text = [NSString stringWithFormat:@"%@",dateString]; 
} 

txtFieldBranchYearjest wylot UITextField

+0

Świetna odpowiedź. Uproszczenie: 'txtFieldBranchYear.text = dateString;' powinno również wykonać zadanie. –

Powiązane problemy