【问题标题】:textFieldShouldBeginEditing is called after unwind seguetextFieldShouldBeginEditing 在 unwind segue 之后被调用
【发布时间】:2016-03-10 07:48:59
【问题描述】:

我有 2 个视图控制器。

如果点击第一个视图控制器的文本字段,它会将用户带到第二个视图控制器。

第二个视图控制器有表格视图,当做出选择时,它会使用 unwind segue 将用户带回第一个视图控制器。

第一个视图控制器

- (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;
}

第二个视图控制器

- (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 并将用户带回第二个视图控制器。

是什么原因造成的,我该如何解决这个问题?

谢谢。

【问题讨论】:

  • 我尝试了 resignFirstResponder,但仍然无法正常工作。我也试过 endEditing 但没有运气:(
  • 我正在尝试将用户导航到具有表格视图的第二个视图,当进行选择时,用户返回到第一个视图并将文本字段的文本设置为选择
  • 刚发现添加self.textField.enabled = NO 可以解决问题,但无法单击文本字段调用第二个视图控制器
  • 我已经做到了,但没有运气
  • 在 textFieldShouldBeginEditing 中你尝试过 resignFirstResponder 吗?

标签: ios objective-c uitextfield unwind-segue


【解决方案1】:

我举了一个例子。请注意,当我们在委托方法中将文本设置为文本视图时,textFieldShouldBeginEditing 不会像我们想要的那样被调用。在情节提要中,必须设置推送 segue id“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

【讨论】:

    【解决方案2】:

    我找到了答案。问题在于 textFieldShouldBeginEditing 返回 YES,这会保持循环。

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

    删除return YES; 后,问题解决了。

    【讨论】:

    • 请问,您为什么在这里使用文本字段而不是标签或按钮,因为我们无法编辑文本?
    • 只是为了好看。有理由不使用文本字段吗?
    • 好吧,如果您不打算编辑文本,那么您可以使用另一个不可编辑的控件并通过textFieldShouldBeginEditing避免这些变通方法
    • 嗯...喜欢哪一个?我不喜欢这个标签
    • UIButton 例如
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2018-06-15
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多