পাঠ্যক্ষেত্রের মাধ্যমে কীভাবে নেভিগেট করবেন (পরবর্তী / সমাপ্ত বোতাম)


487

আইফোন কীবোর্ডের "নেক্সট" বোতামটি দিয়ে আমি কীভাবে আমার সমস্ত পাঠ্য ক্ষেত্রটি নেভিগেট করতে পারি?

শেষ পাঠ্য ক্ষেত্রটির কীবোর্ডটি বন্ধ করা উচিত।

আমি আইবি বাটনগুলি সেটআপ করেছি (নেক্সট / ডোন) তবে এখন আমি আটকে আছি।

আমি টেক্সটফিল্ডশোল্ডার্টেন অ্যাকশনটি প্রয়োগ করেছি তবে এখন নেক্সট এবং সম্পন্ন বোতামগুলি কীবোর্ডটি বন্ধ করে দেয়।


দয়া করে নীচে আমার উত্তরটি দেখুন। আমার অভিজ্ঞতায় এটি সাধারণত দেওয়া উত্তরের চেয়ে ভাল, আরও সম্পূর্ণ, সমাধান। কেন কেউ এটিকে নেতিবাচক রেটিং দেবে তা আমার ধারণা নেই।
স্মারক

আমার অনুরূপ সমস্যা আছে তবে কর্ডোভা নিয়ে, ফোনগ্যাপ এটি সমাধান করার কোনও উপায় আছে কি?

উত্তর:


578

ম্যাক ওএস এক্সের জন্য কোকোতে আপনার পরবর্তী প্রতিক্রিয়াশীল চেইন রয়েছে, আপনি কী নিয়ন্ত্রণের পরে কী নিয়ন্ত্রণ রাখতে হবে তা পাঠ্য ক্ষেত্রটি জিজ্ঞাসা করতে পারেন। এটি টেক্সট ক্ষেত্রের মধ্যে ট্যাবিংয়ের কাজ করে। তবে যেহেতু আইওএস ডিভাইসগুলির একটি কীবোর্ড নেই, কেবলমাত্র স্পর্শ, তাই এই ধারণাটি কোকো টাচের পরিবর্তনে টিকেনি।

এটি দুটি অনুমান সহ সহজেই করা যায়:

  1. সমস্ত "ট্যাবেবল" UITextFieldগুলি একই প্যারেন্ট ভিউতে।
  2. তাদের "ট্যাব-অর্ডার" ট্যাগ বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত করা হয়।

এটি ধরে নিলে আপনি পাঠ্যফিল্ডশিল্ড রিটার্নকে ওভাররাইড করতে পারেন: এটি হিসাবে:

-(BOOL)textFieldShouldReturn:(UITextField*)textField
{
  NSInteger nextTag = textField.tag + 1;
  // Try to find next responder
  UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
  if (nextResponder) {
    // Found next responder, so set it.
    [nextResponder becomeFirstResponder];
  } else {
    // Not found, so remove keyboard.
    [textField resignFirstResponder];
  }
  return NO; // We do not want UITextField to insert line-breaks.
}

আরও কিছু কোড যুক্ত করুন, এবং অনুমানগুলিও এড়ানো যায়।

সুইফট 4.0

 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    let nextTag = textField.tag + 1
    // Try to find next responder
    let nextResponder = textField.superview?.viewWithTag(nextTag) as UIResponder!

    if nextResponder != nil {
        // Found next responder, so set it
        nextResponder?.becomeFirstResponder()
    } else {
        // Not found, so remove keyboard
        textField.resignFirstResponder()
    }

    return false
}

যদি পাঠ্য ক্ষেত্রের তত্ত্বাবধানটি কোনও ইউআইটিএবলভিউসেল হয় তবে পরবর্তী প্রতিক্রিয়াশীল হবে

let nextResponder = textField.superview?.superview?.superview?.viewWithTag(nextTag) as UIResponder!

6
কখনও কখনও কীবোর্ডের উপরে "পরবর্তী" এবং "পূর্ববর্তী" বোতাম থাকে। অন্তত ব্রাউজারে।
টিম বাথ

31
কেবল পেডেন্টিক হতে, আমি এই পোস্টে কিছু ভুল তথ্য পরিষ্কার করতে চাই। ওএস এক্স-এ, এনএসভিউ'র সেটনেক্সটকিভিউ: (সেটনেক্সটরেসপন্ডার নয় :) পদ্ধতির মাধ্যমে ট্যাব অর্ডার সেট আপ করা হয়েছে। প্রতিক্রিয়াশীল চেইন এটি থেকে পৃথক: এটি প্রতিক্রিয়াশীল অবজেক্টগুলির একটি শ্রেণিবিন্যাস যা "নিরক্ষিত" ক্রিয়াকলাপগুলি পরিচালনা করে, যেমন ক্রিয়াকলাপ সরাসরি কোনও নিয়ামক বস্তুর পরিবর্তে প্রথম প্রতিক্রিয়াকারীকে প্রেরণ করা হয়। প্রতিক্রিয়াশীল চেইন সাধারণত উইন্ডো এবং এর নিয়ামক পর্যন্ত, এবং তারপরে অ্যাপের প্রতিনিধি হিসাবে ভিউয়ের স্তরক্রম অনুসরণ করে। গুগল প্রচুর তথ্যের জন্য "প্রতিক্রিয়াশীল চেইন"।
ডেভহেডেন

পাঠ্য ক্ষেত্রের তত্ত্বাবধানটি হবে ক UITableViewCell। আপনাকে সংশ্লিষ্টটি অ্যাক্সেস করতে হবে UITableViewএবং আপনি যে পাঠ্য ক্ষেত্রটি সন্ধান করছেন সেগুলি সহ সেলটি পেতে হবে।
মাইকেল মায়ার 21

13
যোগ করতে UITextFieldDelegateএবং পাঠ্যক্ষেত্রের প্রতিনিধিদের সেট করতে ভুলবেন না ।
সাল

1
স্টোরিবোর্ড থেকে TAG বিকল্পটি সেট করার জন্য বন্ধুত্বপূর্ণ অনুস্মারক (আমার ক্ষেত্রে)। আপনাকে অবশ্যই ম্যানুয়ালি টেক্সটফিল্ডস ট্যাগটি আরোহণের ক্রমে সেট করতে হবে। (প্রথমটি 0, দ্বিতীয়টি 1 ইত্যাদি) কাজের সমাধানের জন্য এটি।
জোয়াকিম

170

আরও অনেক মার্জিত সমাধান রয়েছে যা আমাকে প্রথমবার দেখে ফেলেছিল। উপকারিতা:

  • ওএসএক্স পাঠ্যক্ষেত্রের প্রয়োগের আরও কাছাকাছি যেখানে কোনও পাঠ্যক্ষেত্র জানে যেখানে ফোকাসটি আরও এগিয়ে নেওয়া উচিত
  • ট্যাগগুলি সেট করা বা ব্যবহারের উপর নির্ভর করে না - যা এই ব্যবহারের ক্ষেত্রে আইএমও ভঙ্গুর
  • উভয় UITextFieldএবং UITextViewনিয়ন্ত্রণ - বা যে কোনও কীবোর্ড এন্ট্রি ইউআই নিয়ন্ত্রণের সাথে কাজ করার জন্য বাড়ানো যেতে পারে
  • বয়লারপ্লেট ইউআইটিেক্সটফিল্ড প্রতিনিধি কোড দিয়ে আপনার ভিউ কন্ট্রোলারকে বিশৃঙ্খলা দেখাবে না
  • আইবির সাথে দুর্দান্তভাবে সংহত করে এবং আউটলেটগুলি সংযুক্ত করতে পরিচিত বিকল্প-ড্রাগ-ড্রপের মাধ্যমে কনফিগার করা যায়।

একটি ইউআইটিেক্সটফিল্ড সাবক্লাস তৈরি করুন IBOutletযার নেক্সটফিল্ড নামে একটি সম্পত্তি রয়েছে। শিরোনাম এখানে:

@interface SOTextField : UITextField

@property (weak, nonatomic) IBOutlet UITextField *nextField; 

@end

এবং বাস্তবায়ন এখানে:

@implementation SOTextField

@end

আপনার ভিউ কন্ট্রোলারে, আপনি -textFieldShouldReturn:প্রতিনিধি পদ্ধতি তৈরি করবেন :

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if ([textField isKindOfClass:[SOTextField class]]) {
        UITextField *nextField = [(SOTextField *)textField nextField];

        if (nextField) {
            dispatch_async(dispatch_get_current_queue(), ^{
                [nextField becomeFirstResponder];
            });
        }
        else {
            [textField resignFirstResponder];
        }
    }

    return YES;
}

আইবিতে, SOTextFieldক্লাসটি ব্যবহার করতে আপনার ইউআইটিেক্সটফিল্ডগুলি পরিবর্তন করুন । এরপরে, আইবিতেও, প্রতিটি 'এসটেক্সটফিল্ড''র' ফাইলের মালিক 'এর জন্য প্রতিনিধি সেট করুন (ডেলিগেট পদ্ধতিটির জন্য কোডটি যেখানে রেখেছেন ঠিক সেখানে - টেক্সটফিল্ডশোল্ডার্টર્ન)। এই নকশার সৌন্দর্যটি হ'ল এখন আপনি যে কোনও পাঠ্যফিল্ডে কেবল ডান ক্লিক করতে পারেন এবং পরের ফিল্ড আউটলেটটিকে SOTextFieldপরবর্তী প্রতিক্রিয়া হিসাবে পরবর্তী প্রতিক্রিয়াশীল হিসাবে নির্ধারণ করতে পারেন।

Assigning nextField in IB

তদুপরি, আপনি টেক্সটফিল্ডগুলি লুপের মতো দুর্দান্ত জিনিসগুলি করতে পারেন যাতে শেষটির ফোকাস হারানোর পরে, প্রথমটি আবার ফোকাস গ্রহণ করবে।

এই সহজে স্বয়ংক্রিয়ভাবে দায়িত্ব অর্পণ করা বাড়ানো যেতে পারে returnKeyTypeএর SOTextFieldএকটি থেকে UIReturnKeyNextএক কম জিনিস নিজে কনফিগার - যদি একটি nextField নির্ধারিত হয়।


3
আমি ট্যাগগুলি ব্যবহার করে আইবি সংহতকরণটি পছন্দ করি - বিশেষত এক্সকোডের নতুন সংস্করণগুলির সাথে যা আইবিইয়ের সাথে তার বাকি আইডির সাথে সুন্দরভাবে সংহত করে - এবং বয়লারপ্লেট টেক্সটফিল্ডের প্রতিনিধি কোডের সাথে আমার নিয়ামককে বিশৃঙ্খলা না করানো একটি বোনাস।
স্মরণ 16

4
ট্যাগগুলি সহজ, তবে এই
উপায়টি

1
আমি এই সমাধানটি সত্যিই পছন্দ করি তবে আমি প্রতিটি পাঠ্য ক্ষেত্রকে একটিতে পৃথক কক্ষ দর্শনে ব্যবহার করছি UITableView। যদিও IBOutletপ্রতিটি পাঠ্য ক্ষেত্রের জন্য আমার কাছে ভিউ নিয়ন্ত্রকের বৈশিষ্ট্য রয়েছে তবে এটি আমাকে nextFieldফাইলের মালিকের সেই বৈশিষ্ট্যগুলির সাথে সম্পত্তিটি লিঙ্ক করতে দিচ্ছে না । এই দৃশ্যে আমি কীভাবে এটি কার্যকর করতে পারি তার কোনও পরামর্শ?
জে ইমারম্যান

1
@ জায়েমারম্যান আইবি আপনাকে ঘরগুলির মধ্যে আউটলেটগুলি সংযোগ করতে দেবে না। সুতরাং, আইবি এই দৃশ্যের জন্য কোনও অগ্রগতি হবে। তবে আপনি কোড ব্যবহার করে পরবর্তী ফিল্ডের বৈশিষ্ট্যগুলি সন্ধান করতে পারেন। textField1.nextField = textField2; textField2.nextField = textField3;, ইত্যাদি
স্মরণে

2
এই উত্তরটি এক্সকোড এবং আইওএসের নতুন সংস্করণগুলির জন্য আপডেট করা যেতে পারে?
ট্রান্সলেশন

82

এখানে প্রতিনিধিবিহীন একটি:

tf1.addTarget(tf2, action: #selector(becomeFirstResponder), for: .editingDidEndOnExit)
tf2.addTarget(tf3, action: #selector(becomeFirstResponder), for: .editingDidEndOnExit)

ObjC:

[tf1 addTarget:tf2 action:@selector(becomeFirstResponder) forControlEvents:UIControlEventEditingDidEndOnExit];
[tf2 addTarget:tf3 action:@selector(becomeFirstResponder) forControlEvents:UIControlEventEditingDidEndOnExit];

(বেশিরভাগ অজানা) UIControlEventEditingDidEndOnExit UITextFieldঅ্যাকশন ব্যবহার করে কাজ করে ।

আপনি স্টোরিবোর্ডে খুব সহজেই এটিকে হুক করতে পারেন, সুতরাং কোনও প্রতিনিধি বা কোডের প্রয়োজন নেই।

সম্পাদনা করুন: আসলে স্টোরিবোর্ডে কীভাবে এটি আপ করা যায় তা আমি বুঝতে পারি না। becomeFirstResponderএই নিয়ন্ত্রণ-ইভেন্টটির জন্য প্রস্তাবিত পদক্ষেপ বলে মনে হয় না, যা দুঃখের বিষয়। তবুও, আপনি আপনার ভিউকন্ট্রোলারের একক ক্রিয়ায় আপনার সমস্ত পাঠ্যক্ষেত্রকে আবদ্ধ করতে পারেন যা becomeFirstResponderপ্রেরকের উপর ভিত্তি করে কোন পাঠ্যফিল্ডটি নির্ধারণ করে (যদিও এটি উপরের প্রোগ্রাম্যাটিক সমাধানের মতো মার্জিত নয় তাই আইএমও উপরের কোডটি দিয়ে এটি করে viewDidLoad)।


18
খুব সহজ এবং কার্যকর সমাধান। চেইন শেষ এক এমনকি ট্রিগার করতে পারে [tfN addTarget:self action:@selector(loginButtonTapped:) forControlEvents:UIControlEventEditingDidEndOnExit];। ধন্যবাদ @ এমএক্সসিএল।
এমএসআরডজন

আপনি স্টোরিবোর্ডে এটি কীভাবে করবেন?
পেড্রো বোর্জেস

এটি সম্ভবত এখানে সেরা উত্তর।
daspianist

এটি আমার পক্ষে পুরোপুরি সুইফট ২-তেও কাজ করেছিল, এটি প্রতিনিধিদের যোগ করার চেয়ে অনেক সহজ এবং দ্রুত সমাধান।
টন

2
সুইফট 4: txtFirstname.addTarget (txtLastname, ক্রিয়া: # নির্বাচক (ফার্স্ট রিসপন্ডার), এর জন্য: UIControlEvents.editingDidEndOnExit)
রিয়েলটাইম

78

এই সমস্যার জন্য আমার সমাধান এখানে।

এটি সমাধান করার জন্য (এবং স্টাফ করার জন্য আমি ট্যাগগুলিতে নির্ভর করা ঘৃণা করি) আমি ইউআইটিেক্সটফিল্ড অবজেক্টে একটি কাস্টম সম্পত্তি যুক্ত করার সিদ্ধান্ত নিয়েছি। অন্য কথায় আমি ইউআইটিেক্সটফিল্ডে এর মতো একটি বিভাগ তৈরি করেছি:

UITextField + + Extended.h

@interface UITextField (Extended)

@property(retain, nonatomic)UITextField* nextTextField;

@end

UITextField + + Extended.m

#import "UITextField+Extended.h"
#import <objc/runtime.h>

static char defaultHashKey;

@implementation UITextField (Extended)

- (UITextField*) nextTextField { 
    return objc_getAssociatedObject(self, &defaultHashKey); 
}

- (void) setNextTextField:(UITextField *)nextTextField{
    objc_setAssociatedObject(self, &defaultHashKey, nextTextField, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
}

@end

এখন, আমি এখানে এটি কীভাবে ব্যবহার করব:

UITextField *textField1 = ...init your textfield
UITextField *textField2 = ...init your textfield
UITextField *textField3 = ...init your textfield

textField1.nextTextField = textField2;
textField2.nextTextField = textField3;
textField3.nextTextField = nil;

এবং পাঠ্যফিল্ডশোল্ডার্টেন পদ্ধতিটি প্রয়োগ করুন:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {

    UITextField *next = theTextField.nextTextField;
    if (next) {
        [next becomeFirstResponder];
    } else {
        [theTextField resignFirstResponder];
    }

    return NO; 
}

আমার কাছে এখন ইউআইটিেক্সটফিল্ডের লিঙ্কযুক্ত তালিকার একটি তালিকা রয়েছে, প্রত্যেকে এই লাইনে কে আছে তা জেনে।

আশা করি এটি সাহায্য করবে


11
এটি সেরা সমাধান এবং উত্তর হিসাবে চয়ন করা উচিত।
জিওভানি

4
এই সমাধানটি আমার পক্ষে কাজ করেছে, কেবলমাত্র আমি পরিবর্তন করেছি পরবর্তী টেক্সটফিল্ড এবং আইবিউটলেট তৈরি করা যাতে আমি আমার স্টোরিবোর্ডের মধ্যে থেকে চেইন সেটআপ করতে পারি।
zachzurn

আমি যদি প্রিয় উত্তরগুলি সংরক্ষণ করতে পারি তবে এটি তাদের মধ্যে একটি। পরিষ্কার সমাধানের জন্য ধন্যবাদ!
ম্যাট বেকার

1
মনে রাখবেন যে আইবি যদি আপনার জিনিস হয় তবে আপনি এই বৈশিষ্ট্যগুলিকে আইবিআউটলেট হিসাবে সেট করতে পারেন। । নামের সংঘর্ষের সাথে সতর্ক থাকুন - অ্যাপল শেষ পর্যন্ত এটি ইউআইআরএসপন্ডার যুক্ত করতে পারে।
জ্যাস্পার ব্লুজ

এই সমাধানটি কি ইন্টারফেস বিল্ডারের সাথে সামঞ্জস্যপূর্ণ? আমার অর্থ এটি কি পরবর্তী টেক্সটফিল্ডটি প্রোগ্রাম্যাটিকভাবে সেট করার পরিবর্তে আইবিআউটলেটস এবং স্টোরিবোর্ডের রেফারেন্সগুলি ব্যবহার করতে পারে? আইবি আপনাকে কোনও বিভাগে ইউআইটিেক্সটফিল্ড শ্রেণি সেট করার অনুমতি দেবে বলে মনে হচ্ছে না।
পেড্রো বোর্জেস

46

একটি বিশেষ দ্রষ্টব্য এক্সটেনশন যা এমএক্সসিএল এর উত্তরটিকে এটিকে বিশেষ করে সহজ করার জন্য প্রয়োগ করে (ট্র্যাভেলারের দ্বারা ২.৩ সাঁতারের সাথে অভিযোজিত):

extension UITextField {
    class func connectFields(fields:[UITextField]) -> Void {
        guard let last = fields.last else {
            return
        }
        for i in 0 ..< fields.count - 1 {
            fields[i].returnKeyType = .Next
            fields[i].addTarget(fields[i+1], action: "becomeFirstResponder", forControlEvents: .EditingDidEndOnExit)
        }
        last.returnKeyType = .Done
        last.addTarget(last, action: #selector(UIResponder.resignFirstResponder), forControlEvents: .EditingDidEndOnExit)
    }
}

এটি ব্যবহার করা সহজ:

UITextField.connectFields([field1, field2, field3])

এক্সটেনশনটি সর্বশেষ ক্ষেত্রটি বাদে "নেক্সট" এবং শেষ ক্ষেত্রের জন্য "সম্পন্ন" করতে রিটার্ন বোতামটি সেট করবে এবং এগুলি আলতো চাপলে কীবোর্ডটিকে ফোকাস / বরখাস্ত করবে।

সুইফট <2.3

extension UITextField {
    class func connectFields(fields:[UITextField]) -> Void {
        guard let last = fields.last else {
            return
        }
        for var i = 0; i < fields.count - 1; i += 1 {
            fields[i].returnKeyType = .Next
            fields[i].addTarget(fields[i+1], action: "becomeFirstResponder", forControlEvents: .EditingDidEndOnExit)
        }
        last.returnKeyType = .Done
        last.addTarget(last, action: "resignFirstResponder", forControlEvents: .EditingDidEndOnExit)
    }
}

সুইফট 3: এটির মতো ব্যবহার করুন -

UITextField.connectFields(fields: [field1, field2])

Extension:
    extension UITextField {
        class func connectFields(fields:[UITextField]) -> Void {
            guard let last = fields.last else {
                return
            }
            for i in 0 ..< fields.count - 1 {
                fields[i].returnKeyType = .next
                fields[i].addTarget(fields[i+1], action: #selector(UIResponder.becomeFirstResponder), for: .editingDidEndOnExit)
            }
            last.returnKeyType = .go
            last.addTarget(last, action: #selector(UIResponder.resignFirstResponder), for: .editingDidEndOnExit)
        }
    }

5
বিটিডাব্লু, আপনি যদি কোনও পদক্ষেপ সম্পাদন করতে চান তবে আপনার ভিউ কন্ট্রোলারকে ঠিক তার সাথে সামঞ্জস্য করতে UITextFieldDelegateএবং প্রয়োগ করতে পারেন func textFieldDidEndEditing(textField: UITextField)। শুধু তাড়াতাড়ি ফিরে যদি ফিরে আসে textField != field3
রায়ান

25

আরও সামঞ্জস্যপূর্ণ এবং শক্তিশালী উপায় হল NextResponderTextField আপনি ডেলিগেট নির্ধারণ বা ব্যবহারের প্রয়োজন ছাড়াই ইন্টারফেস নির্মাতা থেকে এটি সম্পূর্ণরূপে কনফিগার করতে পারেন view.tag

আপনার যা করা দরকার তা হ'ল

  1. আপনার UITextFieldহতে শ্রেণীর প্রকার সেট করুনNextResponderTextField এখানে চিত্র বর্ণনা লিখুন
  2. তারপরে আউটলেট সেট করুন nextResponderField পরবর্তী প্রতিক্রিয়াকারীকে নির্দেশ করতে এটির এটি যে কোনও কিছু UITextFieldবা যে কোনও UIResponderসাবক্লাস হতে পারে । এটি একটি ইউআইবাটনও হতে পারে এবং লাইব্রেরিটি TouchUpInsideকেবলমাত্র সক্ষম থাকলেই বোতামটির ইভেন্টটি ট্রিগার করতে যথেষ্ট স্মার্ট । এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

কার্যক্ষেত্রে এখানে পাঠাগারটি রয়েছে:

এখানে চিত্র বর্ণনা লিখুন


হ্যাঁ. সুইফট ৩.১-এর সাথে সত্যিই খুব ভাল কাজ করে, খুব মার্জিত সমাধান, ঠিক কীভাবে আইবিটিকে বাক্সের বাইরে কাজ করা উচিত।
রিচার্ড

দুঃখিত, আমি প্রশ্নটি পাইনি।
mohamede1945

1
নেক্সটরেসপন্ডার টেক্সটফিল্ড আমার পক্ষে কাজ করেছিল। এটি দ্রুত এবং সহজেই ব্যবহারযোগ্য ছিল, কেবলমাত্র একটি সুইফট ফাইল, এবং আমার কোনও হট্টগোল না করে যা প্রয়োজন ছিল ঠিক তা-ই করেছিলেন।
প্যাট ম্যাকজি

এটি দুর্দান্ত কাজ করে! দ্রষ্টব্য: উদাহরণস্বরূপ "নেক্সট" এবং "সম্পন্ন" প্রদর্শন করার জন্য আমাকে রিটার্ন কীটি নিজেই পরিবর্তন করতে হয়েছিল।
মাইক মিলার

14

আমি ইতিমধ্যে এন্ট 0 এবং উত্তরবোট দ্বারা প্রস্তাবিত ওও সমাধানগুলি পছন্দ করি। যাইহোক, আমি একটি দ্রুত এবং ছোট পোকিতে কাজ করছিলাম, তাই আমি সাবক্লাস এবং বিভাগগুলির সাথে বিশৃঙ্খলাগুলি করতে চাই না।

আর একটি সহজ সমাধান হ'ল ক্ষেত্রগুলির একটি এনএসআরারি তৈরি করা এবং আপনি যখন পরের টিপুন তখন পরবর্তী ক্ষেত্রটি অনুসন্ধান করুন। কোনও ওও সমাধান নয়, তবে দ্রুত, সহজ এবং কার্যকর করা সহজ। এছাড়াও, আপনি এক নজরে অর্ডারিং দেখতে এবং সংশোধন করতে পারেন।

এখানে আমার কোড (এই থ্রেডের অন্যান্য উত্তরের উপর নির্মিত):

@property (nonatomic) NSArray *fieldArray;

- (void)viewDidLoad {
    [super viewDidLoad];

    fieldArray = [NSArray arrayWithObjects: firstField, secondField, thirdField, nil];
}

- (BOOL) textFieldShouldReturn:(UITextField *) textField {
    BOOL didResign = [textField resignFirstResponder];
    if (!didResign) return NO;

    NSUInteger index = [self.fieldArray indexOfObject:textField];
    if (index == NSNotFound || index + 1 == fieldArray.count) return NO;

    id nextField = [fieldArray objectAtIndex:index + 1];
    activeField = nextField;
    [nextField becomeFirstResponder];

    return NO;
}
  • আমি সবসময় NO ফেরত থাকি কারণ আমি লাইন ব্রেক sertedোকানো চাই না। কেবল ভেবেছি আমি এটি উল্লেখ করব যেহেতু আমি হ্যাঁ ফিরে এসেছি এটি স্বয়ংক্রিয়ভাবে পরবর্তী ক্ষেত্রগুলি থেকে প্রস্থান করবে বা আমার টেক্সটভিউতে একটি লাইন ব্রেক সন্নিবেশ করবে। এটি বের করতে আমার কিছুটা সময় লেগেছে।
  • অ্যাক্টিভিল্ড কী-বোর্ড থেকে ক্ষেত্রটি অবরুদ্ধ করার জন্য স্ক্রোলিংয়ের ক্ষেত্রে সক্রিয় ক্ষেত্রের উপর নজর রাখে। আপনার যদি অনুরূপ কোড থাকে তবে নিশ্চিত হয়ে নিন যে আপনি প্রথম প্রতিক্রিয়াকারী পরিবর্তন করার আগে অ্যাক্টিভ ফিল্ড নির্ধারণ করেছেন। প্রথম প্রতিক্রিয়াকারী পরিবর্তন করা তাত্ক্ষণিক এবং তত্ক্ষণাত কীবোর্ডওয়াসশাউন ইভেন্টটি চালিত করবে।

নিস! সহজ এবং কোড সবই একটি মডেল। অ্যান্থও খুব ভাল।
Seamus

মনে রাখবেন যে আপনি এই কোডটি দিয়ে চক্র ধরে রাখার ঝুঁকি চালাচ্ছেন। আপনার ফিল্ডআরে আপনার সমস্ত আইবিউটলেটগুলিতে ব্যবহৃত দুর্বল রেফারেন্সগুলিকে অ্যারেতেই শক্তিশালী রেফারেন্সে রূপান্তর করছে।
মাইকেল লং

11

এখানে ইউআইসিএন্ট্রোলটিতে একটি বিভাগ ব্যবহার করে ট্যাবিংয়ের একটি বাস্তবায়ন দেওয়া হয়েছে। এই সমাধানটিতে মাইকেল এবং অ্যান্থ0 এর সমস্ত পদ্ধতির সুবিধা রয়েছে তবে কেবলমাত্র নয়, সমস্ত ইউআইসিএন্ট্রোলের জন্য কাজ করেUITextField । এটি ইন্টারফেস বিল্ডার এবং স্টোরিবোর্ডগুলির সাথে নির্বিঘ্নে কাজ করে।

উত্স এবং নমুনা অ্যাপ্লিকেশন: ইউআইসিএনট্রোলস উইথটাব্বিংয়ের জন্য গিটহাবের সংগ্রহশালা

ব্যবহার:

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

ইন্টারফেস বিল্ডারে NextControl বরাদ্দ করা হচ্ছে

শিরোলেখ:

//
// UIControl+NextControl.h
// UIControlsWithTabbing
//

#import <UIKit/UIKit.h>

@interface UIControl (NextControl)

@property (nonatomic, weak) IBOutlet UIControl *nextControl;

- (BOOL)transferFirstResponderToNextControl;

@end

বাস্তবায়ন:

#import "UIControl+NextControl.h"
#import <objc/runtime.h>

static char defaultHashKey;

@implementation UIControl (NextControl)

- (UIControl *)nextControl
{
    return objc_getAssociatedObject(self, &defaultHashKey);
}

- (void)setNextControl:(UIControl *)nextControl
{
    objc_setAssociatedObject(self, &defaultHashKey, nextControl, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (BOOL)transferFirstResponderToNextControl
{
    if (self.nextControl)
    {
        [self.nextControl becomeFirstResponder];

        return YES;
    }

    [self resignFirstResponder];

    return NO;
}

@end

1
কখনও কখনও পরবর্তী উইজেটটি নিয়ন্ত্রণ নয় যেমন ইউআইটিেক্সটভিউ হয় না এবং আপনি সেখানে ট্যাব করতেও পারেন। প্রকারটি ইউআইটিেক্সটফিল্ড থেকে ইউআরআইএসপন্ডার-এ পরিবর্তন করার বিষয়টি বিবেচনা করুন।
পেড্রো বোর্জেস

1
দুর্দান্ত এবং দুর্দান্ত ডকুমেন্টেশন সহ কাজ করে। আমি আশা করি আমি কয়েক ঘন্টা আগে এই প্রশ্নে স্ক্রল ডাউন। :)
জাভিয়ের ক্যাডিজ

10

আমি অনেকগুলি কোড চেষ্টা করেছি এবং শেষ পর্যন্ত, এটি আমার জন্য সুইফট 3.0 সর্বশেষে [মার্চ 2017] এ কাজ করেছে

ViewControllerশ্রেণী উত্তরাধিকারসূত্রে হবে UITextFieldDelegateএই কোড কাজ তৈরীর জন্য।

class ViewController: UIViewController,UITextFieldDelegate  

প্রাইপ ট্যাগ নম্বর সহ পাঠ্য ক্ষেত্রটি যুক্ত করুন এবং এই ট্যাগ নম্বরটি বরাদ্দ হওয়া ইনক্রিমেন্টাল ট্যাগ নম্বরের ভিত্তিতে উপযুক্ত পাঠ্য ক্ষেত্রে নিয়ন্ত্রণ নিতে ব্যবহৃত হয়।

override func viewDidLoad() {
    userNameTextField.delegate = self
    userNameTextField.tag = 0
    userNameTextField.returnKeyType = UIReturnKeyType.next
    passwordTextField.delegate = self
    passwordTextField.tag = 1
    passwordTextField.returnKeyType = UIReturnKeyType.go
}

উপরের returnKeyType = UIReturnKeyType.nextকোডটিতে, কী প্যাড রিটার্ন কীটি প্রদর্শিত হবে তা যেমন Nextআপনার অন্যান্য বিকল্প রয়েছে তেমনJoin/Go প্রয়োগ রয়েছে আপনার অ্যাপ্লিকেশনটির উপর ভিত্তি করে মানগুলি পরিবর্তন করে।

এটি textFieldShouldReturnইউআইটিেক্সটফিল্ডডেলিগেট নিয়ন্ত্রিত করার একটি পদ্ধতি এবং এখানে ট্যাগ মান বৃদ্ধির উপর ভিত্তি করে আমাদের পরবর্তী ক্ষেত্র নির্বাচন রয়েছে

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
        nextField.becomeFirstResponder()
    } else {
        textField.resignFirstResponder()
        return true;
    }
    return false
 }

ইনপুট ক্ষেত্রটি বাদে এটি কাজ করে UITextView। সমন্বয় এই কিভাবে করতে কোন ধারণা?
T9b

@ T9b আপনার ঠিক কী দরকার? আপনি আপনার অ্যাপটিতে কোন ধরণের নিয়ন্ত্রণ ব্যবহার করছেন?
ভুবনেশ মোহনকুমার

এখানে দুটি ধরণের পাঠ্য ইনপুট রয়েছে, প্রথমটি হ'ল UITextField(পাঠ্যের একক লাইনে প্রবেশ করুন), অন্যটি হ'ল UITextView(পাঠ্যের একাধিক লাইন প্রবেশ করান)। UITextViewস্পষ্টতই এই কোডটিতে সাড়া দেয় না তবে এটি ফর্মগুলিতে ব্যবহার করা যেতে পারে।
T9b

হ্যাঁ, কেবল ইউআইটিেক্সটফিল্ডের কোডের এই অংশটি এবং আপনি ইউআইটিেক্সটভিউয়ের জন্য ইভেন্টটি সংশোধন করার চেষ্টা করেছেন?
ভুবনেশ মোহনকুমার

9

আপনি একটি পাঠ্য ক্ষেত্র থেকে প্রস্থান করার পরে, আপনি [অন্যান্য টেক্সটফিল্ডকে ফার্স্ট রেসপন্ডার] কল করেন এবং পরবর্তী ক্ষেত্রটি ফোকাস পায়।

এটি মোকাবেলা করা আসলে একটি জটিল সমস্যা হতে পারে যেহেতু প্রায়শই আপনি স্ক্রিনটি স্ক্রোল করতে বা অন্যথায় পাঠ্য ক্ষেত্রের অবস্থান সামঞ্জস্য করতে চান যাতে সম্পাদনা করার সময় এটি দেখতে সহজ। বিভিন্ন ক্ষেত্রে পাঠ্যক্ষেত্রের ভিতরে আসা এবং বেরিয়ে আসা এবং খুব তাড়াতাড়ি চলে যাওয়ার সাথে অনেক পরীক্ষা করে নেওয়ার বিষয়টি নিশ্চিত করুন (সর্বদা ব্যবহারকারীকে পরবর্তী ক্ষেত্রে যাওয়ার পরিবর্তে কীবোর্ড খারিজ করার বিকল্প দিন, সাধারণত "সম্পন্ন" নাভ বার)



7

'সম্পন্ন' বোতামটি চাপলে কীবোর্ডটি খারিজ করার জন্য খুব সহজ পদ্ধতিটি হ'ল:

শিরোনামে একটি নতুন আইবিএक्शन তৈরি করুন

- (IBAction)textFieldDoneEditing:(id)sender;

বাস্তবায়ন ফাইলে (.m ফাইল) এ নিম্নলিখিত পদ্ধতিটি যুক্ত করুন:

- (IBAction)textFieldDoneEditing:(id)sender 
{ 
  [sender resignFirstResponder];
}

তারপরে, আপনি যখন পাঠ্যক্ষেত্রের আইবিএটি লিঙ্ক করতে আসেন - 'ডিড এন্ড প্রস্থান' ইভেন্টের লিঙ্ক।


1
আপনাকে স্বাগতম, এটি পাঠ্য ক্ষেত্রগুলির মধ্যে নেভিগেট করে না তবে এটি কীবোর্ডটি বন্ধ করে দেয় এবং আপনাকে অন্য একটি ক্ষেত্র নির্বাচন করার অনুমতি দেয়।
জ্যাকারসন

7

প্রথমে কীবোর্ডের রিটার্ন কীটি xib এ সেট করুন, অন্যথায় আপনি কোডটি লিখতে পারেন viewdidload:

passWord.returnKeyType = UIReturnKeyNext;

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if(textField == eMail) {
        [textField resignFirstResponder];
        [userName becomeFirstResponder];
    }
    if (textField==userName) {
        [textField resignFirstResponder];
        [passWord becomeFirstResponder];
    }
    if (textField==passWord) {
        [textField resignFirstResponder];
        [country becomeFirstResponder];
    }
    if (textField==country) {
        [textField resignFirstResponder];
    }
    return YES;
}

7

আমি এখানে কত উত্তর একটি সাধারণ ধারণা বুঝতে ব্যর্থ হয়ে অবাক হয়েছি: আপনার অ্যাপ্লিকেশনটিতে নিয়ন্ত্রণের মাধ্যমে নেভিগেট করা তাদের নিজের মতামতগুলি করা উচিত নয়। এটা নিয়ামক যা নিয়ন্ত্রণ পরবর্তী প্রথম উত্তর প্রদানকারী করতে সিদ্ধান্ত নিতে 'র কাজ।

এছাড়াও বেশিরভাগ উত্তর কেবলমাত্র এগিয়ে নেভিগেট করার ক্ষেত্রে প্রয়োগ করা হয়েছিল, তবে ব্যবহারকারীরা পিছন দিকে যেতেও চাইতে পারেন।

আমি এখানে এসেছি তাই এখানে। আপনার ফর্মটি একজন ভিউ কন্ট্রোলার দ্বারা পরিচালনা করা উচিত, এবং দেখুন নিয়ন্ত্রণকারীরা প্রতিক্রিয়াশীল শৃঙ্খলার অংশ। সুতরাং আপনি নিম্নলিখিত পদ্ধতিগুলি কার্যকর করতে নিখুঁত মুক্ত:

#pragma mark - Key Commands

- (NSArray *)keyCommands
{
    static NSArray *commands;

    static dispatch_once_t once;
    dispatch_once(&once, ^{
        UIKeyCommand *const forward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:0 action:@selector(tabForward:)];
        UIKeyCommand *const backward = [UIKeyCommand keyCommandWithInput:@"\t" modifierFlags:UIKeyModifierShift action:@selector(tabBackward:)];

        commands = @[forward, backward];
    });

    return commands;
}

- (void)tabForward:(UIKeyCommand *)command
{
    NSArray *const controls = self.controls;
    UIResponder *firstResponder = nil;

    for (UIResponder *const responder in controls) {
        if (firstResponder != nil && responder.canBecomeFirstResponder) {
            [responder becomeFirstResponder]; return;
        }
        else if (responder.isFirstResponder) {
            firstResponder = responder;
        }
    }

    [controls.firstObject becomeFirstResponder];
}

- (void)tabBackward:(UIKeyCommand *)command
{
    NSArray *const controls = self.controls;
    UIResponder *firstResponder = nil;

    for (UIResponder *const responder in controls.reverseObjectEnumerator) {
        if (firstResponder != nil && responder.canBecomeFirstResponder) {
            [responder becomeFirstResponder]; return;
        }
        else if (responder.isFirstResponder) {
            firstResponder = responder;
        }
    }

    [controls.lastObject becomeFirstResponder];
}

স্ক্রোলিং অফস্ক্রিন প্রতিক্রিয়াকারীদের আগে দৃশ্যমান হওয়ার জন্য অতিরিক্ত যুক্তি প্রয়োগ করতে পারে।

এই পদ্ধতির আরেকটি সুবিধা যে সমস্ত (যেমন প্রদর্শন করার জন্য নিয়ন্ত্রণগুলি আপনি কোন ধরণের চাইতে পারেন উপশ্রেণী প্রয়োজন হবে না হয় UITextFieldগুলি) কিন্তু এর পরিবর্তে নিয়ামক স্তর, যেখানে, খুব শীঘ্রই এই সময়ে যুক্তিবিজ্ঞান পরিচালনা করতে পারেন, হয় সঠিক জায়গায় এটা করতে ।


আমি আপনার সর্বাধিক প্রাসঙ্গিকতার উত্তর খুঁজে পাই, তবে আমি মজার কিছু লক্ষ্য করেছি যা সম্ভবত আপনি পরিষ্কার করতে পারেন। ইউআইভিউসকন্ট্রোলার দ্বারা পরিচালিত নয় এমন ইউআইটিেক্সটফিল্ডগুলি ব্যবহার করার সময়, ট্যাব কী টিপলে পরবর্তী ইউআইটিেক্সটফিল্ডটি ডিফল্টরূপে প্রথম প্রতিক্রিয়াশীল করে তুলবে। তবে, যখন প্রত্যেকে ভিসি দ্বারা পরিচালিত হয়, এটি সত্য নয়। আমার ভিসিরা কিছু করছে না, তবে ট্যাবিং কার্যকারিতা বিল্ট ইন। আমি লক্ষ্য করেছি যে উপাচার্যের কী কম্যান্ডগুলি ভিউর প্রতিক্রিয়াশীল চেইনে যুক্ত হওয়া শেষ করে। এটি আমাকে বিশ্বাস করতে পরিচালিত করে যে আপনি যদি ভিসি ব্যবহার করেন তবে কী কম্যান্ডগুলি প্রয়োগ করা বাধ্যতামূলক।
জো কারসন

4

আপনি পূর্ব / পরবর্তী বোতাম কার্যকারিতা বাস্তবায়নের জন্য সেক্ষেত্রে আমি পাইলওয়ের উত্তরটিতে যুক্ত করেছি:

- (IBAction)moveThroughTextFields:(UIBarButtonItem *)sender 
{
    NSInteger nextTag;
    UITextView *currentTextField = [self.view findFirstResponderAndReturn];

    if (currentTextField != nil) {
        // I assigned tags to the buttons.  0 represent prev & 1 represents next
        if (sender.tag == 0) {
            nextTag = currentTextField.tag - 1;

        } else if (sender.tag == 1) {
            nextTag = currentTextField.tag + 1;
        }
    }
    // Try to find next responder
    UIResponder* nextResponder = [self.view viewWithTag:nextTag];
    if (nextResponder) {
        // Found next responder, so set it.
        // I added the resign here in case there's different keyboards in place.
        [currentTextField resignFirstResponder];
        [nextResponder becomeFirstResponder];
    } else {
        // Not found, so remove keyboard.
        [currentTextField resignFirstResponder];

    }
}

আপনি যেখানে ইউআইভিউকে সাবক্লাস করেন এখানে:

@implementation UIView (FindAndReturnFirstResponder)
- (UITextView *)findFirstResponderAndReturn
{
    for (UITextView *subView in self.subviews) {
        if (subView.isFirstResponder){
            return subView;
        }
    }
    return nil;
}
@end

4

হাই সবাই করতে দয়া করে দেখুন এই এক

- (void)nextPrevious:(id)sender
{

  UIView *responder = [self.view findFirstResponder];   

  if (nil == responder || ![responder isKindOfClass:[GroupTextField class]]) {
    return;
  }

  switch([(UISegmentedControl *)sender selectedSegmentIndex]) {
    case 0:
      // previous
      if (nil != ((GroupTextField *)responder).previousControl) {
        [((GroupTextField *)responder).previousControl becomeFirstResponder];
        DebugLog(@"currentControl: %i previousControl: %i",((GroupTextField *)responder).tag,((GroupTextField *)responder).previousControl.tag);
      }
      break;
    case 1:
      // next
      if (nil != ((GroupTextField *)responder).nextControl) {
        [((GroupTextField *)responder).nextControl becomeFirstResponder];
        DebugLog(@"currentControl: %i nextControl: %i",((GroupTextField *)responder).tag,((GroupTextField *)responder).nextControl.tag);
      }     
      break;    
  }
}

ইউআইভিউ * উত্তরদাতার পরিবর্তে ইউআইআরআইএসপিডার * উত্তরদাতা ব্যবহার করা আরও সঠিক হবে
পেড্রো বোর্জেস

4

আমি প্রতিটি কক্ষটি (বা UITextField) UITableViewএকটি অনন্য ট্যাগ মান যা পরে পুনরুদ্ধার করা যেতে পারে তার উপর ভিত্তি করে আরও পরিশীলিত পদ্ধতির ব্যবহার করে এই সমস্যাটি সমাধান করার চেষ্টা করেছি : সক্রিয় করুন-পরবর্তী-ইউাইটেক্সটফিল্ড-ইন-ইউটিভ্যালিভিউ-আইওএস

আশা করি এটা কাজে লাগবে!


4

এই জিনিসটি GNTextFિલ્ডস সংগ্রহে পরিচালকের সাথে কাজ করার সময় আমি নতুন পড তৈরি করেছি । এটি স্বয়ংক্রিয়ভাবে পরবর্তী / শেষ পাঠ্য ফিল্ড সমস্যাটি পরিচালনা করে এবং এটি ব্যবহার করা খুব সহজ:

[[GNTextFieldsCollectionManager alloc] initWithView:self.view];

শ্রেণিবদ্ধ সমস্ত পাঠ্যক্ষেত্রটি ভিউ হায়ারার্কিতে (বা ট্যাগগুলির মাধ্যমে) উপস্থিত হয়ে বা আপনার নিজস্ব পাঠ্যফিল্ডগুলির অ্যারে নির্দিষ্ট করতে পারে।


4

সুইফট ৩.১-এ সমাধান, আপনার পাঠ্য ক্ষেত্রগুলি সংযুক্ত করার পরে আইবিউটলেটগুলি আপনার পাঠ্যক্ষেত্রগুলিকে ভিউডিডলয়েডে প্রতিনিধি স্থাপন করে এবং তারপরে পাঠ্যফিল্ডশোল্ডার্টার্টনে আপনার ক্রিয়াটি নেভিগেট করুন

class YourViewController: UIViewController,UITextFieldDelegate {

        @IBOutlet weak var passwordTextField: UITextField!
        @IBOutlet weak var phoneTextField: UITextField!

        override func viewDidLoad() {
            super.viewDidLoad()
            self.passwordTextField.delegate = self
            self.phoneTextField.delegate = self
            // Set your return type
            self.phoneTextField.returnKeyType = .next
            self.passwordTextField.returnKeyType = .done
        }

        func textFieldShouldReturn(_ textField: UITextField) -> Bool{
            if textField == self.phoneTextField {
                self.passwordTextField.becomeFirstResponder()
            }else if textField == self.passwordTextField{
                // Call login api
                self.login()
            }
            return true
        }

    }

4

কেউ চাইলে এরকম হয়। আমি মনে করি এটি প্রশ্নে জিজ্ঞাসা করা প্রয়োজনীয়তার সবচেয়ে কাছাকাছি

এখানে চিত্র বর্ণনা লিখুন

আমি এখানে এটি কীভাবে বাস্তবায়ন করেছি

প্রতিটি পাঠ্য ক্ষেত্রের জন্য অ্যাকসেসরির ভিউ যুক্ত করুন যা আপনি ব্যবহার করে সেটআপ চান

func setAccessoryViewFor(textField : UITextField)    {
    let toolBar = UIToolbar()
    toolBar.barStyle = .default
    toolBar.isTranslucent = true
    toolBar.sizeToFit()

    // Adds the buttons

    // Add previousButton
    let prevButton = UIBarButtonItem(title: "<", style: .plain, target: self, action: #selector(previousPressed(sender:)))
    prevButton.tag = textField.tag
    if getPreviousResponderFor(tag: textField.tag) == nil {
        prevButton.isEnabled = false
    }

    // Add nextButton
    let nextButton = UIBarButtonItem(title: ">", style: .plain, target: self, action: #selector(nextPressed(sender:)))
    nextButton.tag = textField.tag
    if getNextResponderFor(tag: textField.tag) == nil {
        nextButton.title = "Done"
    }

    let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    toolBar.setItems([prevButton,spaceButton,nextButton], animated: false)
    toolBar.isUserInteractionEnabled = true
    textField.inputAccessoryView = toolBar
}

ট্যাপগুলি পরিচালনা করতে নিম্নলিখিত ফাংশনগুলি ব্যবহার করুন

func nextPressed(sender : UIBarButtonItem) {
    if let nextResponder = getNextResponderFor(tag: sender.tag) {
        nextResponder.becomeFirstResponder()
    } else {
        self.view.endEditing(true)
    }

}

func previousPressed(sender : UIBarButtonItem) {
    if let previousResponder = getPreviousResponderFor(tag : sender.tag)  {
        previousResponder.becomeFirstResponder()
    }
}

func getNextResponderFor(tag : Int) -> UITextField? {
    return self.view.viewWithTag(tag + 1) as? UITextField
}

func getPreviousResponderFor(tag : Int) -> UITextField? {
    return self.view.viewWithTag(tag - 1) as? UITextField
}

আপনি পরবর্তী / পূর্ববর্তী বোতামটি যেভাবে প্রতিক্রিয়া জানাতে চান সেই অনুক্রমের জন্য আপনাকে পাঠ্য ফিল্ডগুলি ট্যাগগুলি দিতে হবে।


3

আমি বরং পছন্দ:

@interface MyViewController : UIViewController
@property (nonatomic, retain) IBOutletCollection(UIView) NSArray *inputFields;
@end

এনআইবি ফাইলে আমি এই ইনপুটফিল্ড অ্যারেটিতে কাঙ্ক্ষিত ক্রমে পাঠ্য ফিল্ডগুলি হুক করেছি। এর পরে আমি ইউআইটিেক্সটফিল্ডের সূচকের জন্য একটি সাধারণ পরীক্ষা করি যা রিপোর্ট করে যে ব্যবহারকারীরা ফিরে আসবে:

// for UITextField
-(BOOL)textFieldShouldReturn:(UITextField*)textField {
    NSUInteger index = [_inputFields indexOfObject:textField];
    index++;
    if (index < _inputFields.count) {
        UIView *v = [_inputFields objectAtIndex:index];
        [v becomeFirstResponder];
    }
    return NO;
}

// for UITextView
-(BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text {
    if ([@"\n" isEqualToString:text]) {
        NSUInteger index = [_inputFields indexOfObject:textView];
        index++;
        if (index < _inputFields.count) {
            UIView *v = [_inputFields objectAtIndex:index];
            [v becomeFirstResponder];
        } else {
            [self.view endEditing:YES];
        }
        return NO;
    }
    return YES;
}

3
যদি (সেল == শূন্য)
{
    ঘর = [[UITableViewCell বরাদ্দ] initWithStyle: UITableViewCellStyleDefault পুনঃব্যবহার আইডেন্টিফায়ার: সেলআইডিটিফায়ার];
    txt_Input = [[UITextField বরাদ্দ] initWithFrame: সিজিআরেক্টমেক (0, 10, 150, 30)];
    txt_Input.tag = indexPath.row + 1;
    [স্ব.আররে_সেক্সটফিল্ডস অ্যাডবজেক্ট: txt_Input]; // ভিউডিডলডে পরিবর্তনীয় অ্যারে শুরু করুন
}

- (BOOL) টেক্সটফিল্ডশোল্ডার্টেনার: (ইউআইটিেক্সটফিল্ড *) টেক্সটফিল্ড
{

    int ট্যাগ = (int) টেক্সটফিল্ড.ট্যাগ;
    ইউআইটিেক্সটফিল্ড * txt = [স্ব.আররে_একটিফিল্ডস অবজেক্টএটিআইডেক্স: ট্যাগ];
    [txt হয়ে ফার্স্ট রেসপন্ডার];
    হ্যাঁ প্রত্যাবর্তন;
}

3

আমার স্টোরি বোর্ডে আমার প্রায় 10+ ইউআইটিেক্সটফিল্ড ছিল এবং আমি পরবর্তী কার্যকারিতাটি যেভাবে সক্ষম করেছি তা হল ইউআইটিেক্সটফিল্ডের একটি অ্যারে তৈরি করা এবং পরবর্তী ইউআইটিেক্সটফিল্ডটিকে প্রথম রেকর্ডার তৈরি করা। বাস্তবায়ন ফাইলটি এখানে:

#import "RegistrationTableViewController.h"

@interface RegistrationTableViewController ()
@property (weak, nonatomic) IBOutlet UITextField *fullNameTextField;
@property (weak, nonatomic) IBOutlet UITextField *addressTextField;
@property (weak, nonatomic) IBOutlet UITextField *address2TextField;
@property (weak, nonatomic) IBOutlet UITextField *cityTextField;
@property (weak, nonatomic) IBOutlet UITextField *zipCodeTextField;
@property (weak, nonatomic) IBOutlet UITextField *urlTextField;
@property (weak, nonatomic) IBOutlet UITextField *usernameTextField;
@property (weak, nonatomic) IBOutlet UITextField *emailTextField;
@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;
@property (weak, nonatomic) IBOutlet UITextField *confirmPWTextField;

@end
NSArray *uiTextFieldArray;
@implementation RegistrationTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"view did load");
    uiTextFieldArray = @[self.fullNameTextField,self.addressTextField,self.address2TextField,self.cityTextField,self.zipCodeTextField,self.urlTextField,self.usernameTextField,self.emailTextField,self.passwordTextField,self.confirmPWTextField];
    for(UITextField *myField in uiTextFieldArray){
        myField.delegate = self;
    }


}
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
    long index = [uiTextFieldArray indexOfObject:textField];
    NSLog(@"%ld",index);
    if(index < (uiTextFieldArray.count - 1)){
        [uiTextFieldArray[++index] becomeFirstResponder];
    }else{
        [uiTextFieldArray[index] resignFirstResponder];
    }
    return YES;
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

3

এটি আমার জন্য Xamarin.iOS / Monotouch এ কাজ করেছিল। কীবোর্ড বোতামটি নেক্সটে পরিবর্তন করুন, পরবর্তী ইউআইটিেক্সটফিল্ডে নিয়ন্ত্রণটি পাস করুন এবং শেষ ইউআইটিেক্সটফিল্ডের পরে কীবোর্ডটি আড়াল করুন।

private void SetShouldReturnDelegates(IEnumerable<UIView> subViewsToScout )
{
  foreach (var item in subViewsToScout.Where(item => item.GetType() == typeof (UITextField)))
  {
    (item as UITextField).ReturnKeyType = UIReturnKeyType.Next;
    (item as UITextField).ShouldReturn += (textField) =>
    {
        nint nextTag = textField.Tag + 1;
        var nextResponder = textField.Superview.ViewWithTag(nextTag);
        if (null != nextResponder)
            nextResponder.BecomeFirstResponder();
        else
            textField.Superview.EndEditing(true); 
            //You could also use textField.ResignFirstResponder(); 

        return false; // We do not want UITextField to insert line-breaks.
    };
  }
}

ভিউডিডলডের অভ্যন্তরে আপনার থাকতে হবে:

যদি আপনার টেক্সটফিল্ডগুলিতে কোনও ট্যাগ এটি সেট না করে থাকে:

txtField1.Tag = 0;
txtField2.Tag = 1;
txtField3.Tag = 2;
//...

এবং শুধু কল

SetShouldReturnDelegates(yourViewWithTxtFields.Subviews.ToList());
//If you are not sure of which view contains your fields you can also call it in a safer way:
SetShouldReturnDelegates(txtField1.Superview.Subviews.ToList());
//You can also reuse the same method with different containerViews in case your UITextField are under different views.

3

এটি কোনও দ্রুতগতির একটি সহজ সমাধান, কোনও ট্যাগ ব্যবহার না করে, স্টোরিবোর্ডের কৌশল নয় ...

কেবল এই এক্সটেনশনটি ব্যবহার করুন:

extension UITextField{

    func nextTextFieldField() -> UITextField?{
        //field to return
        var returnField : UITextField?
        if self.superview != nil{
            //for each view in superview
            for (_, view) in self.superview!.subviews.enumerate(){
                //if subview is a text's field
                if view.isKindOfClass(UITextField){
                    //cast curent view as text field
                    let currentTextField = view as! UITextField
                    //if text field is after the current one
                    if currentTextField.frame.origin.y > self.frame.origin.y{
                        //if there is no text field to return already
                        if returnField == nil {
                            //set as default return
                            returnField = currentTextField
                        }
                            //else if this this less far than the other
                        else if currentTextField.frame.origin.y < returnField!.frame.origin.y{
                            //this is the field to return
                            returnField = currentTextField
                        }
                    }
                }
            }
        }
        //end of the mdethod
        return returnField
    }

}

এবং এটি আপনার পাঠ্যক্ষেত্রের প্রতিনিধিদের সাথে এটিকে (উদাহরণস্বরূপ) কল করুন:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    textField.nextTextFieldField()?.becomeFirstResponder()
    return true
}

এ সম্পর্কে একটি মন্তব্য হ'ল আপনার পদ্ধতিটি অনুমান করে যে সমস্ত ক্ষেত্র একক তদারকিতে উল্লম্বভাবে সজ্জিত। এটি গোষ্ঠীযুক্ত ক্ষেত্রগুলির জন্য মঞ্জুরি দেয় না এবং পাঠ্যক্ষেত্র পাশাপাশি থাকা যখন কাজ করে না। অনুভূতির দর্শনগুলির জন্য ফর্মগুলি পুনরায় সাজানোর জন্য এবং যখন ট্যাবলেটে ফর্মগুলি প্রদর্শিত হয় তখন এইগুলি পরে গুরুত্বপূর্ণ especially
মাইকেল লং

3

একটি নিরাপদ এবং আরও প্রত্যক্ষ উপায়, ধরে নিই:

  • পাঠ্য ক্ষেত্রের প্রতিনিধিরা আপনার দর্শন নিয়ামককে সেট করেছে
  • সমস্ত পাঠ্য ক্ষেত্র একই দৃষ্টিভঙ্গির সাবভিউ
  • আপনি অগ্রগতি করতে চান এমন পাঠ্য ক্ষেত্রগুলিতে ট্যাগ রয়েছে (উদাঃ, TextField2.tag = 2, textField3.tag = 3, ইত্যাদি)
  • আপনি কিবোর্ডে রিটার্ন বোতামটি ট্যাপ করার পরে পরবর্তী পাঠ্য ক্ষেত্রে সরিয়ে নেওয়া হবে (আপনি এটি পরবর্তী , সম্পন্ন ইত্যাদিতে পরিবর্তন করতে পারেন ))
  • আপনি সর্বশেষ পাঠ্য ক্ষেত্রের পরে কীবোর্ডটি খারিজ করতে চান

সুইফট ৪.১:

extension ViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        let nextTag = textField.tag + 1
        guard let nextTextField = textField.superview?.viewWithTag(nextTag) else {
            textField.resignFirstResponder()
            return false
        }

    nextTextField.becomeFirstResponder()

    return false

    }
}

2

টেক্সটফিল্ড শোল্ডার রিটার্নে আপনাকে পরীক্ষা করা উচিত যে আপনি যে পাঠ্যক্ষেত্রটি বর্তমানে রয়েছেন তা যখন তারা পরবর্তী ক্লিক করেন এবং এটির কী-বোর্ডটি বরখাস্ত করে না ..


আরে, ঠিক আছে এটি কাজ করে, তবে কীভাবে আমি "পরবর্তী" বোতামটি দিয়ে পরবর্তী পাঠ্যপুস্তকে যেতে পারি?
পিএইচএক্স

2

এটি একটি পুরানো পোস্ট, তবে একটি উচ্চ পৃষ্ঠার র‌্যাঙ্ক রয়েছে তাই আমি আমার সমাধানটি দিয়েছি।

আমারও অনুরূপ সমস্যা ছিল এবং UIToolbarডায়নামিক টেবিলের পরবর্তী / পূর্ববর্তী / সম্পন্ন কার্যকারিতা পরিচালনা করার জন্য একটি সাবক্লাস তৈরি শেষ করেছিভিউ বিভাগগুলি সহ: https://github.com/jday001/DataEntryToolbar

আপনি সরঞ্জামদণ্ডটি আপনার পাঠ্য ক্ষেত্রগুলির ইনপুটঅ্যাকসেসরিভিউ হিসাবে সেট করেছেন এবং সেগুলি এর অভিধানে যুক্ত করেছেন। এটি আপনাকে গতিশীল সামগ্রীর সাথেও সামনের দিকে এবং পিছনের দিকে চক্র করতে দেয়। টেক্সটফিল্ড নেভিগেশন ঘটে যখন আপনি নিজের কার্যকারিতা ট্রিগার করতে চান তবে ডেলিগেটের পদ্ধতি রয়েছে, তবে আপনাকে কোনও ট্যাগ বা প্রথম প্রতিক্রিয়াশীল স্থিতি পরিচালনার জন্য ডিল করতে হবে না।

বাস্তবায়নের বিশদটি সহায়তা করতে গিটহাব লিঙ্কে কোড স্নিপেটস এবং একটি উদাহরণ অ্যাপ রয়েছে। ক্ষেত্রগুলির মধ্যে মানগুলি ট্র্যাক করতে আপনার নিজের ডেটা মডেল প্রয়োজন need


2

ইউএসিং ট্যাগ ছাড়াই এবং নেক্সটফিল্ড / নেক্সটেক্সটফিল্ডের জন্য কোনও সম্পত্তি যুক্ত না করে আপনি এটি ট্যাব অনুকরণ করতে চেষ্টা করতে পারেন, যেখানে "টেস্টইনপুট" আপনার বর্তমান সক্রিয় ক্ষেত্র:

if ([textInput isFirstResponder])
    [textInput.superview.subviews enumerateObjectsAtIndexes:
     [NSIndexSet indexSetWithIndexesInRange:
      NSMakeRange([textInput.superview.subviews indexOfObject:textInput]+1,
                  [textInput.superview.subviews count]-[textInput.superview.subviews indexOfObject:textInput]-1)]
                                                    options:0 usingBlock:^(UIView *obj, NSUInteger idx, BOOL *stop) {
                                                        *stop = !obj.hidden && [obj becomeFirstResponder];
                                                    }];
if ([textInput isFirstResponder])
    [textInput.superview.subviews enumerateObjectsAtIndexes:
     [NSIndexSet indexSetWithIndexesInRange:
      NSMakeRange(0,
                  [textInput.superview.subviews indexOfObject:textInput])]
                                                    options:0 usingBlock:^(UIView *obj, NSUInteger idx, BOOL *stop) {
                                                        *stop = !obj.hidden && [obj becomeFirstResponder];
                                                    }];

2

আমি মাইকেল জি ইমনস এর উত্তরটি প্রায় এক বছর ধরে ব্যবহার করছি, দুর্দান্ত কাজ করে। আমি সম্প্রতি লক্ষ্য করেছি যে পদত্যাগকারী ফার্স্ট রেসপন্ডার এবং তারপরে ফার্স্টরেসপন্ডার অবিলম্বে কল করার সাথে সাথে কীবোর্ডটি "গ্লানি" হতে পারে, অদৃশ্য হয়ে যায় এবং তারপরে তত্ক্ষণাত উপস্থিত হতে পারে। নেক্সটফিল্ড উপলভ্য থাকলে আমি পদত্যাগের জন্য সর্বপ্রথম রিসপন্ডারটি এড়িয়ে যেতে তার সংস্করণটি কিছুটা পরিবর্তন করেছি।

- (BOOL) টেক্সটফিল্ডশোল্ডার্টেনার: (ইউআইটিেক্সটফিল্ড *) টেক্সটফিল্ড
{ 

    যদি ([টেক্সটফিল্ড isKindOfClass: [এনআরটেক্সটফিল্ড শ্রেণি]])
    {
        এনআরেক্সটফিল্ড * এনটেক্সট = (এনআরেক্সটফিল্ড *) টেক্সটফিল্ড;
        যদি ([এনটেক্সটফিল্ডফিল্ড]! = শূন্য) {
            dispatch_async (dispatch_get_main_queue (),
                           ; {[[ntext NextField] হয়ে ফার্স্টরেসপন্ডার]; });

        }
        অন্য {
            [টেক্সটফিল্ড পদত্যাগপত্রে প্রথম রিসপন্ডার];
        }
    }
    অন্য {
        [টেক্সটফিল্ড পদত্যাগপত্রে প্রথম রিসপন্ডার];
    }

    সত্য প্রত্যাবর্তন;

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.