2016-03-10 4 views
0

У меня есть 2 контроллера вида.textFieldShouldBeginEditing вызывается после размотки segue

Если щелкнуть текстовое поле с контроллера первого взгляда, требуется переход на второй контроллер.

Контроллер второго представления имеет вид таблицы, и когда выбор сделан, он возвращает пользователя к первому виду контроллера, используя разматывающий сегмент.

Первый View Controller

- (IBAction)unwindFromModalViewController:(UIStoryboardSegue *)segue 
{ 
    if ([segue.sourceViewController isKindOfClass:[SecondViewController class]]) 
    { 
     SecondViewController *secondVC = segue.sourceViewController; 
     if (secondVC.selectedData) 
     { 
      self.textField.text = secondVC.selectedData; 
     } 
    } 
} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    if (textField == self.textField) 
    { 
     SecondViewController *secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
     return YES; 
    } 
    return NO; 
} 

Second View Controller

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSDictionary *selectedRow = [self.json objectAtIndex:indexPath.row]; 
    self.selectedData = [selectedRow objectForKey:@"data"]; 
    [self performSegueWithIdentifier:@"tofirstVC" sender:self]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.destinationViewController isKindOfClass:[FirstViewController class]]) 
    { 
     FirstViewController *firstVC = segue.destinationViewController; 
     if (self.selectedData) 
     { 
      firstVC.textField.text = self.selectedData; 
     } 
    } 
} 

После того, как пользователь возвращается к первому контроллеру представления, textFieldShouldBeginEditing вызывается и принимает пользователя обратно к второй контроллер.

Что вызывает это, и как я могу исправить эту проблему?

спасибо.

+0

Я попробовал resignFirstResponder, но все еще не работает. Я также пробовал endEditing, но не повезло :( – OHHO

+0

Я пытаюсь перейти к пользователям со вторым представлением, имеющим табличное представление, и когда выбор сделан, пользователи возвращаются к первому представлению, а текст текстового поля установлен на выбор – OHHO

+0

Просто найдено добавление 'self.textField.enabled = NO' останавливает проблему, но не может щелкнуть текстовое поле, чтобы вызвать контроллер второго представления – OHHO

ответ

0

Я привел пример. Обратите внимание, что когда мы устанавливаем текстовое представление в методе делегата, textFieldShouldBeginEditing не вызывается, как мы хотим. В раскадровке должен быть установлен идентификатор «toSecondVC». Кстати, я не понимаю, почему вы используете здесь UITextField, потому что вы не можете редактировать текст вручную в любом случае.

FirstViewController.h

#import <UIKit/UIKit.h> 

#import "SecondViewController.h" 

@interface FirstViewController : UIViewController<UITextFieldDelegate, SecondViewControllerDelegate> 

@property (strong, nonatomic) IBOutlet UITextField *textField; 

@end 

FirstViewController.m

#import "FirstViewController.h" 

@interface FirstViewController() 

@end 

@implementation FirstViewController 

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

- (void)setText:(NSString *)text 
{ 
    _textField.text = text; 
} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    if (textField == self.textField) 
    { 
     [self performSegueWithIdentifier:@"toSecondVC" sender:self]; 
     return YES; 
    } 
    return NO; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"toSecondVC"]) { 
     SecondViewController *vc = segue.destinationViewController; 
     vc.delegate = self; 
    } 
} 

@end 

SecondViewController.h

#import <UIKit/UIKit.h> 

@protocol SecondViewControllerDelegate <NSObject> 

- (void)setText:(NSString*)text; 

@end 

@interface SecondViewController : UITableViewController 

@property (nonatomic, strong) NSString *selectedData; 
@property (nonatomic, weak) id<SecondViewControllerDelegate> delegate; 

@end 

SecondViewController.m

#import "SecondViewController.h" 
#import "FirstViewController.h" 

@interface SecondViewController() 
{ 
    NSArray *_data; 
} 

@end 

@implementation SecondViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _data = @[@"first", @"second", @"third"]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return _data.count; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
    } 

    cell.textLabel.text = _data[indexPath.row]; 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.selectedData = _data[indexPath.row]; 
    [_delegate setText:_selectedData]; 
    if ([_delegate isMemberOfClass:[FirstViewController class]]) { 
     [(FirstViewController*)_delegate dismissViewControllerAnimated:YES completion:nil]; 
    } 
} 

@end 
+0

Я попытался создать сеанс, но все еще не работает – OHHO

0

Я нашел ответ. Проблема заключалась в том, что textFieldShouldBeginEditing возвращает YES, который поддерживает цикл.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    if (textField == self.textField) 
    { 
     SecondViewController *secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
    } 
    return NO; 
} 

После удаления return YES; он решил проблему.

+0

Могу ли я узнать, почему вы используете текстовое поле здесь, а не, скажем, ярлык или кнопку, так как мы не можете редактировать текст? – schmidt9

+0

Просто для взглядов. Есть ли причина не использовать текстовые поля? – OHHO

+0

Ну, если вы не собираетесь редактировать текст, тогда вы можете использовать другой не редактируемый элемент управления и избегать этих обходных решений с помощью 'textFieldShouldBeginEditing' – schmidt9

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