2010-12-14 7 views
13

Я только что начал с xcode и object-c и сделал некоторые очень простые приложения, но у меня проблема с этим очень просто. кнопка возврата клавиатуры не скрывает клавиатуру.Делегат для UITextField не работает ... Кнопка возврата не отвечает

Я искал интернет для решения, и все, что они говорят, это связать делегата с владельцем файла и добавить функцию, и она должна работать, я сделал это и ничего не работает.

У меня есть кнопка ОК, и она работает, а также нажав на любое свободное место на экране работает, только кнопки возврата ....

Я использую тренажер, не испытывая на Iphone пока. (xcode 3.2.5 64 бит с симулятором 4.2).

Это строка кода, которая должна связывать делегат с каждым текстовым файлом. 1. Я уже пробовал возвращать оба YES и NO, не работал. 2. Я попробовал как конкретное имя объекта для textField, так и этот общий способ, не работал.

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
[textField resignFirstResponder]; 
return NO; 
} 

В: основной вид подключения контроллера -> Подключения -> розетки, у меня есть: делегат - Владелец файла. и в владельце файла в реферирующих точках есть: делегат - текст в стиле раунда .....

EDIT - я забыл упомянуть об этом раньше, я проверял и метод не вызывается !!!

- (BOOL)textFieldShouldReturn:(UITextField *)textField{ 
NSLog(@"Working!!!"); 
[textField resignFirstResponder]; 
return YES; 

}

, что я должен сделать, чтобы это произошло? поэтому люди говорят, чтобы связать делегата, но в моем случае это связано и не вызывает функцию ... я знаю, что это своего рода глупый вопрос, но для такого благородного, как я, решение не очевидно ...

OK, другой Edit - со всем моим кодом: просто не могу понять, что делать .... Это: basicViewController.h:

#import <UIKit/UIKit.h> 

@interface basicViewController : <#superclass#> <UITextFieldDelegate> 

@interface basicViewController : UIViewController <UITextFieldDelegate> { 
//every object that we want to interact with (like text field or lable) is call an outlet!!!! 
//here we define the outlets for our program 
IBOutlet UITextField *txtName; 
IBOutlet UILabel *lblMessage; 
} 

//here are the getters and setter for our outlets 
@property (nonatomic, retain) IBOutlet UITextField *txtName; 
@property (nonatomic, retain) IBOutlet UILabel *lblMessage; 

//method decleration for the OK button action 
- (IBAction) doSomething; 



//method for hiding the keyboard when clicking on empty area in the app 
    //we will put an invisible button on all area and clicking on it will make keyboard disapear 
    - (IBAction) makeKeyboardGoAway; 

    @end 

Это basicViewController.m:

#import "basicViewController.h" 

@implementation basicViewController 

//synthesizeing the objects that we made' this will create the getter and setters automaticly 
@synthesize txtName; 
@synthesize lblMessage; 

- (IBAction) doSomething{ 
// makeing keyboard disapear when pressing ok button (doing that form the text field) 
//when pressing the OK button, the keyboard will disapear and when clicking in the text field it will show again 
[txtName resignFirstResponder]; 



NSString *msg = [[NSString alloc] initWithFormat:@"Hello, %@",txtName.text]; 

//the objective-c way for setting the test in the text field 
[lblMessage setText:msg]; 
//the regular object oriented way 
//lblMessage.text = msg; 
[msg release]; 
}  

- (IBAction) makeKeyboardGoAway{ 
[txtName resignFirstResponder]; 
} 

//when clicking the return button in the keybaord 
- (BOOL)textFieldShouldReturn:(UITextField *)textField{ 
NSLog(@"Working!!!"); 
[textField resignFirstResponder]; 
return YES; 
} 


- (void)didReceiveMemoryWarning { 
// Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

// Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
// Release any retained subviews of the main view. 
// e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 

@end 

Может быть, теперь я более ясен, извините, я этого не делал раньше. У любого есть идея, что я делаю неправильно? оно должно быть довольно Пролив вперед .....

EDIT - Добавление изображения всех элементов, я надеюсь, что поможет мне помочь :-) alt text

10x много для каждого который пытается помочь .... Мне очень нравится эта фреймворк, она настолько велика после C++ и java, python и многих других ... и я работаю с книгой, но это для ios 3.1, может быть, это проблема .....

+0

Если метод не вызывается, вы должны следовать шагам в моем ответе ниже, которые должны вас поймать. – Rog

+0

ОК, я пытаюсь это сделать сейчас, но я думал, что вы сказали, что его нужно называть, прежде чем делать другие вещи .... я скоро буду ждать ДА или НЕТ (цель-c-стиль) ... .LOL – Erez

+0

Это проблема соединения bro ничего больше. Ok выберите файлы owener и open inspector теперь выберите имя textField IBoutlet из view.now, когда вы увидите, что делегат в инспекторе подключений теперь подключается к владельцу файла. Это всегда работает, поэтому проверьте правильно. – Ishu

ответ

31

Во-первых, вы должны проверить, действительно ли вызывается textFieldShouldReturn:, добавив инструкцию NSLog или точку останова в начале метода.

После того, как это из пути, попробуйте вручную объявить, что ваш контроллер представления соответствует <UITextFieldDelegate> протокола в файле интерфейса:

@interface YourClass : ... <UITextFieldDelegate>

объявить также выпускное свойство & для вашего UITextField, сделать соответствующий соединения в IB и вручную объявить self как UITextField делегата с:

self.yourUITextFieldObject.delegate = self;

Как только это будет сделано, посмотрите, вызван ли ваш метод выше и убедитесь, что вы вернули ДА.

+0

Я пропустил «self.yourUITextFieldObject.delegate = self;» заявление. Наконец, он решил! Спасибо и +1. –

+0

ссылка не работает atm – Esqarrouth

+0

Спасибо @Rog self.yourUITextFieldObject.delegate = self; эта строка кода решила мою проблему. –

0

Вы можете попробовать это ..

@interface ClassName : SuperClass <UITextFieldDelegate> 
+0

Это только в том случае, если вы хотите переопределить метод делегата ..... в этом нет оснований делать это. – Erez

1

положил журнал на функцию

- (IBAction) makeKeyboardGoAway 

. Я думаю, что этот метод каждый раз, когда что-либо используется на экране. В этом случае вам нужно будет отправить событие касания в текстовое поле. Не уверен, как это делается, но это должно сделать это. Повторите попытку удаления того, что заботится о кране (щелкните) по всему представлению и попытайтесь сделать то, что вы делаете.

+0

10x, отлично .... удален привязка для всего экрана и работает отлично ... теперь я думаю, что он просто покрыл клавиатуру или что-то в этом роде .... 10x – Erez

1

Скорее всего, проблема в том, что ваш фактический контроллер представления в запущенном приложении не является «basicViewController», а UIViewController, который не реализует протокол UITextFieldDelegate.

То, что вы сделали в интерфейсе строителе, выбрав свой класс «basicViewController» как FilesOwner просто объявляя FilesOwner-объект в вашем запущенном приложении, чтобы быть типом basicViewController; фактическим объектом является , а не, созданный этой декларацией, а в вашем случае это не в xib/nib.

Некоторые другие части вашего кода фактически создают экземпляр объекта контроллера вида и загружают файл xib/nib. В этом месте, я думаю, ваш код создает экземпляр UIViewController (как правило, автоматически сгенерированный код), а не экземпляр вашего элемента управления basicViewController; вам просто нужно изменить класс.

Кроме того, эта ошибка часто возникает при использовании UINavigationController или UITabBarController в построителе интерфейсов, который (должен быть) настроен для создания экземпляров и загрузки других пользовательских представлений. Если вы используете такой контроллер более высокого уровня, дважды проверьте, что на самом деле он настроен на использование вашего базового монитора, а не UIViewController при загрузке вашего представления из xib/nib.

Надеюсь, что решает проблему!

6

Просто напишите одну строку в

-(BOOL)textFieldShouldReturn:(UITextField *)textField{ 
} 

перед возвращением ДА; окончательный вариант будет, как указано ниже:

-(BOOL)textFieldShouldReturn:(UITextField *)textField{ 
    [textField resignFirstResponder]; 
    return YES; 
} 

-(void)textFieldDidEndEditing:(UITextField *)textField{ 

    NSLog(@"%@",textField.text); 
} 
3

Вам нужно назначить делегат из текстовых полей для вашего владельца файла. Текстовые поля отправляют сообщение, но не имеют делегата для ответа на него.

Используйте конструктор интерфейса для этого. Вы должны реализовать этот метод ..

-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return YES; 
} 
+0

Вправо. Просто убедитесь, что вы установили владельца файла в качестве делегата текстового поля. В противном случае текстовое поле отправит ответное сообщение, но никто не ответит на него. Вы можете установить делегат с помощью конструктора интерфейса. – fofo

0

Используйте как это ...

textfield.delegate=self; 

и использовать UITextFieldDelegate в .h классе сказал

+0

У меня был UICollectionViewController, который программно сгенерировал UITextFields и не мог понять, почему сделанный ключ не стрелял. Это сделал трюк. – jim

2

Как Rog, не забудьте зарегистрируйте текстовое поле для делегата, вы можете сделать это вручную, как он сказал, но в Storyboard вы можете просто управлять перетаскиванием из всех текстовых полей в контроллер вида и зарегистрировать делегат (выберите делегат). Только те текстовые поля, которые зарегистрированы, могут использовать все эти методы.

Так эта линия имеет важное значение:

self.yourUITextFieldObject.delegate = self; 

Или еще более просто в эти дни, чтобы просто использовать раскадровку:

enter image description here

0

Вы всегда можете закрыть клавиатуру, когда вы не даже знать, с каким видом находится текстовое поле, используя:

Цель-C:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) 
              to:nil 
             from:nil 
            forEvent:nil]; 

Swift:

UIApplication.sharedApplication().sendAction("resignFirstResponder", 
              to:nil, 
             from:nil, 
            forEvent:nil) 
0

У меня была такая же проблема. У меня есть отдельный класс MyTextFieldDelegate только для моего UITextFieldDelegate, который расширяет UIViewController и UITextFieldDelegate. У меня есть textFieldShouldReturn (...) и некоторые другие функции в нем. В функции ViewDidLoad (...) моей текущей UIViewController (например, MyViewController) я писал:

let myTextfieldDelegateLowLimit = MyTextFieldDelegate() 
textfieldLowLimitTo.delegate = myTextfieldDelegateLowLimit 

И это не работает для меня. Но когда я объявлял myTextfieldDelegateLowLimit глобально, это сработало.

0

текстовое поле находится в подпункте? в этом случае убедитесь, что текстовое поле имеет делегат FileOwner.

Смежные вопросы