تخزين محتويات uitextfield قبل عرض الملوثات العضوية الثابتة

StackOverflow https://stackoverflow.com/questions/4061788

سؤال

أنا متأكد من أن هذا موجود في وثائق Apple أو يجب الرد عليه في مكان ما في هذا المنتدى ، لأنه يبدو أساسيًا للغاية ، لكنني لم أتمكن من العثور عليه ولا حلًا أنيقًا بشكل خاص بنفسي.

ما لدي هو uiviewController الذي يدفع طريقة عرض التحرير على مكدس التنقل الخاص به. يحتوي عرض التحرير على مجموعة من uitextfields فيه. إذا تم تحرير أحدهم عند لمس زر الخلف ، يتم استدعاء طريقة ViewWillAppear الأصلية textFieldShouldEndEditing أو textFieldDidEndEditing, ، أو الإجراء المرتبط IB 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];
}

في EditViewControlleru003CUITextFieldDelegate> :

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

ينتهي السجل بـ:

...] سوف يظهر إدخال العرض للمنظر الرئيسي
...] تحرير الكائن
...] في العرض
...] - نحن لسنا في مكدس وحدة التحكم ... تم دفع زر الخلف
...] سوف يظهر إدخال العرض للمنظر الرئيسي
...] في Textfieldshouldingiting
...] في TextFieldedInged
...] في TextFieldDidenditing

اريد ان تعيين self.editedObject.name = nameField.text قبل تعيين التسمية في viewWillAppear ل uiviewController.

فكرت في طريقة ViewWillDisAppear للتحقق من EditViewController لمعرفة ما إذا كان أي من حقول النص الخاصة بي هو المستجيب الأول حاليًا ، وإذا كان الأمر كذلك ، فإن هذا الأمر يتخزينه وتخزينه ، لكن هذا يبدو كأنه كولد سيكون مؤلمًا للحفاظ على ما إذا كنت إضافة أو تغيير حقول النص.

يمكنني أيضا تنفيذ textFieldEditingChanged الإجراء المرتبط IB بتعيين النص في الكائن المعدل بعد كل ضغط مفتاح ، لكن هذا أيضًا جزء كبير من النفقات العامة لأنني يجب أن أعرف أي حقل النص الذي أنا في كل ضغط مفتاح (تذكر أنني أظهرت فقط name ولكن هناك مجموعة كاملة منهم).

كل ما أحتاجه هو أن ينتهي التحرير أو معرفة أن التحرير سينتهي قبل أن يتم استدعاء ViewWillAppear في UiviewController بحيث يتم تعيين NameFieldLabel بشكل صحيح.

هل كانت مفيدة؟

المحلول

حسنًا ، لقد اكتشفت حلًا بسيطًا بعد الكثير من التواجد على الويب ، وقراءة المنتدى ، والقراءة اليدوية. لقد كان ، كما أظن ، بسيطًا جدًا ، تم إضافة سطر واحد فقط من التعليمات البرمجية. في ال viewWillDisappear طريقة EditViewContorller لقد أضفت ببساطة:

    [self.view.window endEditing: YES];

حاليا textFieldShouldEndEditing, textFieldEditingEnded, ، و textFieldDidEndEditing يتم إطلاق النار جميعها قبل viewWillAppear من المنظر الرئيسي يفعل.

حتى الآن viewWillDisappear الطريقة تبدو مثل:

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

والطرق الموجودة بالفعل في مكانها للتعامل مع "العودة" على لوحة المفاتيح تتعامل أيضًا مع زر "العودة" على وحدة تحكم التنقل.

شكرا لك هارون وجيف على مساعدتكم ومساعدتي في التفكير في ذلك.

نصائح أخرى

لماذا لا تنشئ زر العودة الخاص بك فقط مع هذا المنطق في طريقة الإجراء الخاصة به؟

أعتقد أنه من منظور UX ، يجب عليك عرض تنبيه لتحديد ما إذا كان المستخدم يريد إلغاء إجراء التحرير الذي كانوا في منتصفه قبل الخروج من العرض الحالي.

من خلال تنبيه المستخدم ، يمكنك معرفة ما إذا كان يضغطون على الزر عن طريق الصدفة أو إذا قرروا ترك العرض ، أو اتخاذ الإجراء المناسب.

// 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top