代码之家  ›  专栏  ›  技术社区  ›  LavaSlider

在弹出视图之前存储UITextField内容

  •  13
  • LavaSlider  · 技术社区  · 14 年前

    我确信这是在苹果的文档中,或者一定是在这个论坛的某个地方得到了回答,因为它看起来很基本,但是我自己找不到它,也找不到一个特别优雅的解决方案。

    我拥有的是一个UIViewController,它在导航堆栈上推送一个编辑视图。编辑视图中有许多UITextFields。如果在单击后退按钮时其中一个正在编辑,则在的UITextField委托方法之前调用原始视图的ViewWillAppear方法 textFieldShouldEndEditing textFieldDidEndEditing textFieldEditingEnded 方法被调用。

    下面是一些代码,我希望能让它更清晰:

    在UIViewController中:

    - (void) viewWillAppear: (BOOL) animated {
        [super viewWillAppear: animated];
        NSLog( @"Entering view will appear for master view" );
        nameLabelField.text = objectToEdit.name;
    }
    - (IBAction) editMyObject: (id) sender {
        NSLog( @"Editing the object" );
        EditViewController *evc = [[EditViewController alloc] initWithNibName: @"EditTableView" bundle: nil];
        evc.editedObject = objectToEdit;
        [self.navigationController pushViewController: evc animated: YES];
        [evc release];
    }
    

    在EditViewController<UITextFieldDelegate>中:

    - (void) viewWillAppear: (BOOL) animated {
        [super viewWillAppear: animated];
        nameField.text = editedObject.name;
    }
    - (void) viewWillDisappear: (BOOL) animated {
        [super viewWillDisappear: animated];
        NSLog( @"In viewWillDisappear" );
        if( [self.navigationController.viewControllers indexOfObject: self] == NSNotFound ) {
            NSLog( @"-- We are not in controller stack... the back button has been pushed" );
        }
    }
    - (BOOL) textFieldShouldEndEditing: (UITextField *) textField {
        NSLog( @"In textFieldShouldEndEditing" );
        // Store text field value here???
        // editedObject.name = nameField.text;
        return YES;
    }
    - (void) textFieldDidEndEditing: (UITextField *) textField {
        NSLog( @"In textFieldDidEndEditing" );
        // Store text field value here???
        // editedObject.name = nameField.text;
    }
    - (IBAction) textFieldEditingEnded: (id) sender {
        NSLog( @"In textFieldEditingEnded" );
        // Store text field value here???
        // editedObject.name = nameField.text;
    }
    

    日志的结尾是:

    主视图将显示[…]进入视图
    […]编辑对象
    视图中的[…]将消失
    […]--我们不在控制器堆栈中。。。已按下后退按钮
    主视图将显示[…]进入视图
    文本字段中的[…]应取消编辑
    文本字段编辑中的[…]

    我想设定 self.editedObject.name = nameField.text 在标签设置之前 viewWillAppear 对于UIViewController。

    我在viewwilldiscover方法中考虑过让EditViewController检查我的文本字段是否是当前的第一个响应者,如果是,则获取它们的文本并将其存储,但这似乎是一个很难维护的错误,如果我添加或更改文本字段。

    我也可以实现 textFieldEditingChanged IB链接操作,用于在每次击键后设置编辑对象中的文本,但这也有相当大的开销,因为我必须确定每次击键时我在哪个文本字段中(请记住,我只显示了 name 但是有很多)。

    我只需要在UIViewController中调用viewWillAppear之前结束编辑或知道编辑将结束,以便正确设置nameFieldLabel。

    3 回复  |  直到 14 年前
        1
  •  17
  •   LavaSlider    14 年前

    好吧,我想了一个简单的解决方案,经过大量的网上冲浪,论坛阅读,和手工阅读。正如我所怀疑的,它非常简单,只添加了一行代码。在 viewWillDisappear 我简单地添加了editViewController的方法:

        [self.view.window endEditing: YES];
    

    textFieldShouldEndEditing , textFieldEditingEnded ,和 textFieldDidEndEditing 所有人都会在 viewWillAppear

    所以现在 方法如下:

    - (void) viewWillDisappear: (BOOL) animated {
        [super viewWillDisappear: animated];
        NSLog( @"In viewWillDisappear" );
        // Force any text fields that might be being edited to end so the text is stored
        [self.view.window endEditing: YES];
    }
    

    而已经存在的处理键盘上“Return”的方法也处理导航控制器上的“Back”按钮。

    谢谢亚伦和杰夫的帮助,帮助我把这件事想清楚。

        2
  •  0
  •   Jeff Kelley    14 年前

    为什么不创建自己的Back按钮,在其action方法中使用该逻辑呢?

        3
  •  -1
  •   Aaron Saunders    14 年前

    我认为,从用户体验的角度来看,您应该显示一个警报,以确定用户是否希望取消退出当前视图之前正在进行的编辑操作。

    通过提醒用户,您可以看到他们是偶然按下按钮,还是确实决定离开视图,请采取适当的操作。

    // add this to the field(s) to be edited, selector will be called as the changes
    // are being made... still difficult to handle a cancel, but should work
    [objectToEdit addTarget:self action:@selector(updateNameField:) 
                             forControlEvents:UIControlEventEditingChanged];
    

    // the method called to update object from parent view
    - (void)updateNameField:(id)sender {
        <OBJECT TO UPDATE>.text = ((UITextField *)sender).text;
    }