রিটার্ন কী দিয়ে ইউআইটিেক্সটভিউয়ের কী-বোর্ড কীভাবে খারিজ করবেন?


381

আইবির লাইব্রেরিতে, ভূমিকাটি আমাদের জানায় যে returnকীটি টিপলে, কীবোর্ডটি UITextViewঅদৃশ্য হয়ে যাবে। তবে আসলে returnকীটি কেবল 'only n' হিসাবে কাজ করতে পারে।

আমি একটি বোতাম যুক্ত করতে পারি এবং [txtView resignFirstResponder]কীবোর্ডটি আড়াল করতে ব্যবহার করতে পারি।

returnকীবোর্ডে কীটির জন্য ক্রিয়াটি যুক্ত করার কোনও উপায় আছে যাতে আমাকে যুক্ত করার দরকার নেই UIButton?


এই ব্লগ পোস্টে নির্দেশাবলী অনুসরণ করুন: iphonedePLertips.com/cocoa/…
মনোজএন

উত্তর:


354

UITextViewব্যবহারকারীর রিটার্ন কীটি হিট করার সময় কল করা হবে এমন কোনও পদ্ধতি নেই। আপনি যদি ব্যবহারকারীটি কেবল একটি লাইনের পাঠ্য যোগ করতে সক্ষম হন তবে একটি ব্যবহার করুন UITextField। রিটার্নটি হিট করা এবং কীবোর্ডটি লুকানোর জন্য UITextViewইন্টারফেসের নির্দেশিকা অনুসরণ করে না।

তারপরেও আপনি যদি এটি করতে চান তবে textView:shouldChangeTextInRange:replacementText:পদ্ধতিটি প্রয়োগ করুন UITextViewDelegateএবং প্রতিস্থাপন পাঠ্য কিনা তা পরীক্ষা \nকরে দেখুন, কীবোর্ডটি আড়াল করুন।

অন্যান্য উপায় থাকতে পারে তবে আমি কোনও বিষয়েই অবগত নই।


1
ধন্যবাদ এবং পদ্ধতিটি ভালভাবে কাজ করে। ইউআইটিেক্সটভিউ ব্যবহার করার কারণ হ'ল এটি একাধিক লাইনে পাঠ্য ধারণ করতে পারে। এবং এখন আমি এটি একটি বার্তা বাক্স হিসাবে ব্যবহার করছি।
চিলি ঝং

28
[textField setReturnKeyType: UIReturnKeyDone];ইন্টারফেস বিল্ডার ব্যবহার করে বা ব্যবহার করে "সম্পন্ন" করতে রিটার্ন কীটি পরিবর্তন করা যথেষ্ট সহজ
কেসব্যাশ

9
ঠিক আছে, আমি এখন বুঝতে পেরেছি যে
মাল্টিলাইন

7
এটি সমাধানের জন্য এটি ভাল উপায় নয় কারণ আপনি কীবোর্ড থেকে বেরিয়ে যাওয়ার জন্য প্রবেশদ্বারকে ব্যবহারকারীদের সীমাবদ্ধ করছেন। সম্ভবত সর্বোত্তম উপায় হ'ল একটি বোতাম যুক্ত করা যা ইস্তফা দিয়ে ফার্স্ট রিসপন্ডার পদ্ধতি কার্যকর করে।
এলে

5
@Casebash। দেখে মনে হচ্ছে যে "সম্পন্ন হয়েছে" -এর রিটার্ন কীটি সেট করা Xcode 6.4, সুইফট 2.0 তে সমস্যার সমাধান করে না। আমি আইবি ব্যবহার করে কীটি সেট করেছিলাম।
এমবি_আইওএস ডেভেলপার

504

অনুমিত আমি পরিবর্তে এখানে স্নিপেট পোস্ট করব:

আপনি UITextViewDelegateপ্রোটোকলের জন্য সমর্থন ঘোষণা করেছেন তা নিশ্চিত করুন ।

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    if([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

সুইফট 4.0 আপডেট:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}

75
সমস্যাটি হ'ল এটি প্রকৃতপক্ষে রিটার্ন কীটি টেপ করেছে এটি সনাক্ত করার কোনও উপায় নয় । ব্যবহারকারী পাঠ্য ক্ষেত্রে একটি রিটার্ন অক্ষর পেস্ট করতে পারে এবং আপনি একই প্রতিনিধি বার্তাটি পেতে পারেন। মূলত আপনি পাঠ্য দর্শনটির অপব্যবহার করছেন। কীবোর্ড খারিজ করার উপায় হ'ল (১) একেবারেই না করা (মেল অ্যাপে কোনও বার্তা লেখার সময় যেমন) বা (২) ইন্টারফেসের অন্য কোনও জায়গায় ডোন বোতাম রাখা (নোটস অ্যাপের মতো)। উদাহরণস্বরূপ, আপনি কীবোর্ডে আনুষঙ্গিক ভিউ হিসাবে এই জাতীয় বোতাম সংযুক্ত করতে পারেন।
ম্যাট

@ স্যাম ভি যে স্নিপেট শীতল মানুষ ছিল। এটা আমার জন্য কাজ করে. ধন্যবাদ একটি টন মানুষ। সংখ্যার কীবোর্ড বিচ্ছিন্ন করার জন্য কি কোনও স্নিপেট আছে?
শিশিরকে

মহৎ। কেবল একটি অনুস্মারক যে কিছু পরিস্থিতিতে কীবোর্ড থেকে মুক্তি পেতে লাইনগুলি দিয়ে চেষ্টা করুন ... [স্ব.উইউভিউ সমাপ্তি সম্পাদনা: হ্যাঁ];
ফ্যাটি

@ ভোজ্টো, আইপ্যাডে ভাল কাজ করে। আপনি সম্ভবত প্রতিনিধি সেট করেন নি।
ভিনসেন্ট

4
সমস্যাটি হ'ল কীবোর্ডটি ইন্টারফেসের অংশটি লুকিয়ে থাকতে পারে যা বরখাস্ত করার জন্য ব্যবহৃত হয়। এটি সত্যই অযৌক্তিক যে আইওএসের কীবোর্ড খারিজ করতে উত্সর্গীকৃত প্রতিটি কীবোর্ডে একটি বোতাম নেই যাতে ব্যবহারকারী ইচ্ছা করতে পারেন তাই করতে পারেন।
সানি এলফিশাওয়াই

80

আমি জানি এটি ইতিমধ্যে উত্তর দেওয়া হয়েছে তবে আমি নতুন লাইনের জন্য স্ট্রিং আক্ষরিক ব্যবহার করতে পছন্দ করি না তাই এখানে আমি যা করেছি তা এখানে।

- (BOOL)textView:(UITextView *)txtView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if( [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet]].location == NSNotFound ) {
        return YES;
    }

    [txtView resignFirstResponder];
    return NO;
}

সুইফট 4.0 আপডেট:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if (text as NSString).rangeOfCharacter(from: CharacterSet.newlines).location == NSNotFound {
    return true
}
txtView.resignFirstResponder()
return false
}

6
আমি এটির মতো এটি সংশোধন করতে পারি: এনএসরেঞ্জ রেজাল্ট রেঞ্জ = [পাঠ্য পরিসরঅফচার্যাকারফ্রমসেট: [এনএসচ্যাকারসেট নিউলাইনচারারসেট] বিকল্পগুলি: এনএসব্যাকওয়ার্ডস অনুসন্ধান]; এটি যেহেতু হ্যাক তাই মনে হচ্ছে কোনও ফেরতের জন্য স্ট্রিংয়ের শেষ পরীক্ষা করা নিরাপদ রুট হতে পারে।
সর্বাধিক শক্তি

@ ম্যাক্সপাওয়ার খুব ভাল মন্তব্য। এছাড়া, এটিও প্রতিস্থাপিত টেক্সট, যেমন বিরুদ্ধে চেক করতে ভালো NSString *replacedText = [textView.text stringByReplacingCharactersInRange:range withString:text]
রুডল্ফ আদমকোভিč

একটি ব্যবহারকারী অন্যত্র থেকে কপি করা কিছু টেক্সট পেস্ট কল্পনা রয়েছে একটি newline। পাঠ্য সংযোজনের পরিবর্তে অ্যাপটি কেবল কীবোর্ড খারিজ করলে তারা সম্ভবত বিভ্রান্ত হবে be
নিকোলাই রুহে

44

আমি জানি এটির অনেক বার উত্তর দেওয়া হয়েছে, তবে ইস্যুটি সম্পর্কে আমার দুটি সেন্ট এখানে রয়েছে।

আমি উত্তর পাওয়া যায় নি samvermette এবং ribeto সত্যিই দরকারী, এবং এছাড়াও মন্তব্য maxpower মধ্যে ribeto এর উত্তর। তবে সেই পদ্ধতির সাথে একটি সমস্যা আছে। ম্যাট সম্রাটমেটের উত্তরে যে সমস্যাটি উল্লেখ করেছে এবং এটি হ'ল যদি ব্যবহারকারী তার মধ্যে একটি লাইন ব্রেক দিয়ে কোনও কিছু আটকে দিতে চায় তবে কীবোর্ডটি কোনও কিছুই আটকানো ছাড়াই আড়াল করে দেয়।

সুতরাং আমার পদ্ধতির উপরে উল্লিখিত তিনটি সমাধানের মিশ্রণ এবং কেবল স্ট্রিংটির দৈর্ঘ্য 1 হলে স্ট্রিংটি একটি নতুন রেখা রয়েছে কিনা তা পরীক্ষা করে দেখছি আমরা নিশ্চিত হয়েছি যে আটকানোর পরিবর্তে ব্যবহারকারী টাইপ করছেন।

আমি যা করেছি তা এখানে:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSRange resultRange = [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch];
    if ([text length] == 1 && resultRange.location != NSNotFound) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

এটি এই সমস্যার জন্য সেরা সমাধান। samvermette উত্তর ব্যবহারকারীর একটি পাঠ্য আটকানোর জন্য পরিস্থিতি বিবেচনা করে না।
marcopaivaf

36

আরও মার্জিত উপায় হ'ল ব্যবহারকারী যখন কীবোর্ডের ফ্রেমের বাইরে কোথাও ট্যাপ করেন।

প্রথমে আপনার ভিউকন্ট্রোলারের ভিউ ইউআইবিল্ডারের পরিচয় পরিদর্শকের "ইউআইসিএন্ট্রোল" শ্রেণিতে সেট করুন। ভিউকন্ট্রোলারের হেডার ফাইলে দৃশ্যটি নিয়ন্ত্রণ-টেনে আনুন এবং এটিকে ইভেন্টের সাথে টাচ আপ ইনসাইড হিসাবে একটি ক্রিয়া হিসাবে লিঙ্ক করুন, যেমন:

ViewController.h

-(IBAction)dismissKeyboardOnTap:(id)sender;

মূল ভিউকন্ট্রোলার ফাইলটিতে, ভিউকন্ট্রোলআরএম:

-(IBAction)dismissKeyboardOnTap:(id)sender
    {
         [[self view] endEditing:YES];
    }

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

সূত্র: বিগ Nerd রাঞ্চ

সম্পাদনা: আমি আরও যুক্ত করতে চাই যে আপনি যদি ইউআইএসক্রোলভিউ ব্যবহার করেন তবে উপরের কৌশলটি ইন্টারফেস বিল্ডারের মাধ্যমে সহজে কাজ করতে পারে না। সেক্ষেত্রে আপনি একটি ইউআইজিস্টচারআর সনাক্তকারী ব্যবহার করতে পারেন এবং এর পরিবর্তে [[স্বদর্শন] সমাপ্তি: হ্যাঁ] পদ্ধতিটি কল করতে পারেন। একটি উদাহরণ হবে:

-(void)ViewDidLoad{
    ....
    UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] 
        initWithTarget:self action:@selector(tap:)];
    [self.view addGestureRecognizer: tapRec];
    ....
}

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: YES];
}

যখন ব্যবহারকারী কীবোর্ডের বাইরে ট্যাপ করে এবং কোনও প্রবেশ স্থান স্পর্শ না করে, কীবোর্ডটি বরখাস্ত হবে।


1
আমি ধারণাটি পছন্দ করি GestureRecognizerতবে বিশাল সমস্যাটি হ'ল ভিউতে সমস্ত বোতাম বা নিয়ন্ত্রণ আর ক্লিকযোগ্য হয় না।
বিশেষজ্ঞ

34

আপনার ভিউ কন্ট্রোলারে এই পদ্ধতিটি যুক্ত করুন।

দ্রুত :

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}

এই পদ্ধতিটি আপনার জন্যও সহায়ক হতে পারে:

/**
Dismiss keyboard when tapped outside the keyboard or textView

:param: touches the touches
:param: event   the related event
*/
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    if let touch = touches.anyObject() as? UITouch {
        if touch.phase == UITouchPhase.Began {
            textField?.resignFirstResponder()
        }
    }
}

2
প্রোটোকল UITextViewDelegate :) ভুলবেন না ভুলবেন না
সুইফটবয়

আমি মনে করি না টাচবেগানকে ওভাররাইড করা এবং কল না করা ভাল ধারণা super.touchesBegan(touches:withEvent:)
টিজিও

এই কোডটির প্রতিসম প্রকৃতি প্রকাশ করতে আপনার লেখা উচিত else { return true }
অর্থ-বিষয়গুলি

@ অর্থ-বিষয়গুলি একেবারেই নয়
আলেকজান্ডার ভোলকভ

@ আলেকজান্ডারভোলকভ আপনি একমত হন না এটি একটি প্রতিসম পরিস্থিতি, আপনি জানেন না আমার অর্থ কী, আপনি শব্দার্থগতভাবে সঠিক কোডের মান বিশ্বাস করেন না, বা ...?
অর্থ-বিষয়গুলি

26
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"])
        [textView resignFirstResponder];
    return YES;
}

yourtextView.delegate=self;

যোগ করুন UITextViewDelegate

প্রোটোকল নিশ্চিত করতে ভুলবেন না

যদি আপনি যুক্ত না করেন তবে if([text isEqualToString:@"\n"])আপনি সম্পাদনা করতে পারবেন না


2
-1 এটি সাম্যাভারমেটের উত্তরের একটি দরিদ্র সংস্করণ। পাঠ্যটির NOসমান হলে আপনি ফিরে যাওয়া মিস করেছেন @"\n"
devios1

17

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

ভিউডিডলডে

toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)]; //toolbar is uitoolbar object
toolBar.barStyle = UIBarStyleBlackOpaque;
UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(btnClickedDone:)];
[toolBar setItems:[NSArray arrayWithObject:btnDone]];

টেক্সটভিউডেলেগেট পদ্ধতিতে

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
     [textView setInputAccessoryView:toolBar];
     return YES;
}

টুলবারে থাকা বোতামের ক্রিয়াটি নিম্নলিখিত:

-(IBAction)btnClickedDone:(id)sender
{
    [self.view endEditing:YES];
}

17

উত্তরটি জোসেবামায় পেয়েছি উত্তরটি এই থ্রেডে উপলব্ধ সবচেয়ে সম্পূর্ণ এবং পরিষ্কার উত্তর ।

নীচে এটির জন্য সুইফট 4 বাক্য গঠন:

func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool {
    let resultRange = text.rangeOfCharacter(from: CharacterSet.newlines, options: .backwards)
    if text.count == 1 && resultRange != nil {
        textView.resignFirstResponder()
        // Do any additional stuff here
        return false
    }
    return true
}

resultRangeপরীক্ষা করার লক্ষ্যে কাজ করে কিনা শুধুমাত্র পাঠ্য নতুন লাইন যে হার্ড কোড "\ N" এড়াতে ধারণ করে।
কিঙ্গুয়া


6

কীবোর্ড খারিজ করতে একটি বার হোস্ট করতে নেভিগেশন নিয়ামক ব্যবহার করে:

.h ফাইলটিতে:

UIBarButtonItem* dismissKeyboardButton;

.m ফাইলটিতে:

- (void)viewDidLoad {
    dismissKeyboardButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissKeyboard)];
}

-(void)textViewDidBeginEditing:(UITextView *)textView {
    self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
}

-(void)textFieldDidBeginEditing:(UITextField *)textField {
    self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
}

-(void)dismissKeyboard {
    [self.textField resignFirstResponder];
    [self.textView resignFirstResponder];
    //or replace this with your regular right button
    self.navigationItem.rightBarButtonItem = nil;
}

5

সম্রাটমেটকে যেমন ম্যাট মন্তব্য করা হয়েছে তেমনই "\ n" সনাক্ত করার ধারণাটি আমি পছন্দ করি না। "রিটার্ন" কীটি ইউআইটিেক্সটভিউতে একটি কারণে রয়েছে, এটি অবশ্যই পরবর্তী লাইনে যেতে হবে।

আমার মতে সেরা সমাধান হ'ল আইফোন বার্তা অ্যাপ্লিকেশনটির নকল করা - যা কীবোর্ডে সরঞ্জামদণ্ড (এবং বোতাম) যুক্ত করা।

আমি নিম্নলিখিত ব্লগ পোস্ট থেকে কোড পেয়েছি:

http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/

পদক্ষেপ:

আপনার এক্সআইবি ফাইলটিতে সরঞ্জামদণ্ড যুক্ত করুন - উচ্চতা 460 এ সেট করুন

- টুলবার বোতাম আইটেম যুক্ত করুন (যদি ইতিমধ্যে যুক্ত না করা হয়)। আপনার যদি এটি ডান-প্রান্তিককরণের প্রয়োজন হয় তবে এক্সআইবিতে নমনীয় বার বোতাম আইটেম যুক্ত করুন এবং সরঞ্জামদণ্ডের বোতাম আইটেমটি সরান

পদক্ষেপটি পদত্যাগ করতে আপনার বোতাম আইটেমটিকে লিঙ্ক হিসাবে অনুসরণ করুন:

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

-Then:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height - 260.0;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}

- (void)keyboardWillHide:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}

অন্য প্রসঙ্গ. যদিও আপনার সমাধানটি মার্জিত, এটি মূল প্রশ্নের প্রতিক্রিয়া জানায় না: "রিটার্ন কী সহ ইউআইটিেক্সটভিউয়ের কী-বোর্ড কীভাবে খারিজ করবেন?" এমন পরিস্থিতিতে রয়েছে যখন ইউআইটিেক্সটভিউ একাধিক লাইনে প্রবেশ না করে, ইউআইটিেক্সটফিল্ডকে মোড়ানো কোনও শব্দ অনুকরণ করার জন্য নিযুক্ত করা হয়।
সুইফট আরকিটেক্ট

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

5

এই সমস্যাটিকে সবেমাত্র অন্যরকমভাবে সমাধান করেছেন।

  • একটি বোতাম তৈরি করুন যা পটভূমিতে স্থাপন করা হবে
  • অ্যাট্রিবিউট ইন্সপেক্টর থেকে বোতামের প্রকারটি কাস্টমতে পরিবর্তন করুন এবং বোতামটি স্বচ্ছ করে তোলে।
  • পুরো দৃশ্যটি কভার করতে বোতামটি প্রসারিত করুন এবং অন্যান্য সমস্ত বস্তুর পিছনে বোতামটি রয়েছে তা নিশ্চিত করুন। এটি করার সহজ উপায় হ'ল ভিউ-র তালিকার শীর্ষে বোতামটি টানুন
  • viewController.hফাইলটিতে বোতামটি টানুন নিয়ন্ত্রণ করুন এবং একটি ক্রিয়া তৈরি করুন (ইভেন্ট প্রেরণ করুন: ভিতরে টাচ আপ করুন):

    (IBAction)ExitKeyboard:(id)sender;
  • মধ্যে ViewController.mদেখতে হবে:

    (IBAction)ExitKeyboard:(id)sender {
        [self.view endEditing:TRUE];
    }
  • অ্যাপ্লিকেশন চালান, এবং আপনি যখন টেক্সটভিউ থেকে দূরে ক্লিক করেন, কীবোর্ডটি অদৃশ্য হয়ে যায়

আপনাকে এগুলি যুক্ত করতে হবে: - (শূন্য) পাঠ্য ভিউডআইডিএন্ড সম্পাদনা: (ইউআইটিেক্সটভিউ *) পাঠ্য ভিউ {[স্ব। }
সামুরে

5

ডিভিডোডে একটি পর্যবেক্ষক যুক্ত করুন

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(textViewKeyPressed:) name: UITextViewTextDidChangeNotification object: nil];

এবং তারপরে "\ n" পরীক্ষা করার জন্য নির্বাচকটি ব্যবহার করুন

-(void) textViewKeyPressed: (NSNotification*) notification {

  if ([[[notification object] text] hasSuffix:@"\n"])
  {
    [[notification object] resignFirstResponder];
  }
}

এটি "\ n" ব্যবহার করে এবং কোনও রিটার্ন কীটি বিশেষভাবে পরীক্ষা করে না, তবে আমি মনে করি এটি ঠিক আছে।

হালনাগাদ

নীচে রাইবো এর উত্তর দেখুন যা ব্যবহার করে [NSCharacterSet newlineCharacterSet] এর জায়গায় করে\n


ত্রুটিযুক্ত এটি ব্যবহার করে \nএবং রিটার্ন কীটি এর ভিত্তিতে সনাক্ত করা হয় \nসুতরাং এটি রিটার্ন কীটি পরীক্ষা করে না। পার্থক্যটি হ'ল আপনি টেক্সটভিউ ডেলেগেটগুলি ব্যবহার না করে বিজ্ঞপ্তি ব্যবহার করছেন।
গুডস্পিনিপি

এখন আমি think [NSCharacterSet newlineCharacterSet]n এর চেয়ে পরীক্ষা করা আরও ভাল উপায় হতে পারে বলে আমি মনে করি ।
টডবি

5

সুইফট কোড

আপনার শ্রেণিতে UITextViewDelegate প্রয়োগ করুন / এর মতো দেখুন:

class MyClass: UITextViewDelegate  { ...

টেক্সটভিউ প্রতিনিধিটিকে নিজের মতো করে সেট করুন

myTextView.delegate = self

এবং তারপরে নিম্নলিখিতটি প্রয়োগ করুন:

  func textViewDidChange(_ textView: UITextView) {
    if textView.text.characters.count >= 1 {

        if let lastChar = textView.text.characters.last {

            if(lastChar == "\n"){

              textView.text = textView.text.substring(to: textView.text.index(before: textView.text.endIndex))
              textView.resignFirstResponder()
            }
        }
    }
}

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


4

এটা চেষ্টা কর :

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    if ([text isEqualToString:@"\n"]) {
        [self.view endEditing:YES];
    }

    return YES;

}

4

// আপনি এটি ব্যবহার করতে পারেন ...

পদক্ষেপ 1. প্রথম পদক্ষেপটি হ'ল আপনি UITextViewDelegateপ্রোটোকলের জন্য সমর্থন ঘোষণা করেছেন তা নিশ্চিত করা। এটি আপনার শিরোনাম ফাইলে করা হয়, উদাহরণস্বরূপ এখানে শিরোনাম বলা হয়

EditorController.h:

@interface EditorController : UIViewController  {
  UITextView *messageTextView;
}

@property (nonatomic, retain) UITextView *messageTextView;

@end

পদক্ষেপ ২. পরবর্তী আপনাকে কন্ট্রোলারটি ইউআইটিেক্সটভিউয়ের প্রতিনিধি হিসাবে নিবন্ধিত করতে হবে। উপরোক্ত উদাহরণে থেকে অব্যাহত, এখানে আমি আরম্ভ আছে UITextViewসঙ্গে EditorControllerপ্রতিনিধি হিসেবে ...

- (id) init {
    if (self = [super init]) {
        // define the area and location for the UITextView
        CGRect tfFrame = CGRectMake(10, 10, 300, 100);
        messageTextView = [[UITextView alloc] initWithFrame:tfFrame];
        // make sure that it is editable
        messageTextView.editable = YES;

        // add the controller as the delegate
        messageTextView.delegate = self;
    }

পদক্ষেপ ৩. এবং এখন ধাঁধার চূড়ান্ত টুকরোটি shouldCahngeTextInRangeনিম্নরূপ বার্তার প্রতিক্রিয়াতে পদক্ষেপ নেওয়া :

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
  replacementText:(NSString *)text
{
    // Any new character added is passed in as the "text" parameter
    if ([text isEqualToString:@"\n"]) {
        // Be sure to test for equality using the "isEqualToString" message
        [textView resignFirstResponder];

        // Return FALSE so that the final '\n' character doesn't get added
        return FALSE;
    }
    // For any other character return TRUE so that the text gets added to the view
    return TRUE;
}

3

দেখার স্ক্রিনে টাচ করার সময় আপনি কীবোর্ডটিও আড়াল করতে পারেন:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch * touch = [touches anyObject];
     if(touch.phase == UITouchPhaseBegan) {
        [txtDetail resignFirstResponder];
      }
 }

আইএমএইচও, এটি খুব ভাল পন্থা, পুরো ভিউটি কভার করার বোতামের চেয়ে অনেক ভাল।
ওয়েবঅরকোড

3

দ্রুত উত্তর:

override func viewDidLoad() {
    super.viewDidLoad()
    let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
    view.addGestureRecognizer(tapGestureReconizer)
}

func tap(sender: UITapGestureRecognizer) {
    view.endEditing(true)
}

3

আমি এই কোডটি উত্তরদাতা পরিবর্তন করতে ব্যবহার করেছি।

 - (BOOL)textView:(UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
    {
        if ([text isEqualToString:@"\n"]) {
            //[textView resignFirstResponder];
            //return YES;
            NSInteger nextTag = textView.tag + 1;
            // Try to find next responder
            UIResponder* nextResponder = [self.view viewWithTag:nextTag];
            if (nextResponder) {
                // Found next responder, so set it.
                [nextResponder becomeFirstResponder];
            } else {
                // Not found, so remove keyboard.
                [textView resignFirstResponder];
            }
            return NO; 


            return NO;
        }
        return YES;

    }

কেন ব্যবহার করবেন না [স্ব-দর্শন শেষ সম্পাদনা: হ্যাঁ]; একদা??
অজয়_নাস

3

রিটার্ন কীটি কীভাবে এটি করবেন তা প্রশ্ন জিজ্ঞাসা করে তবে আমি মনে করি এটি ইউআইটিেক্সটভিউ ব্যবহার করার সময় কেবল কীবোর্ডকে অদৃশ্য করতে অভিপ্রায় ব্যক্তিকে সহায়তা করতে পারে:

private func addToolBarForTextView() {
    let textViewToolbar: UIToolbar = UIToolbar()
    textViewToolbar.barStyle = .default
    textViewToolbar.items = [
        UIBarButtonItem(title: "Cancel", style: .done,
                  target: self, action: #selector(cancelInput)),
        UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
                  target: self, action: nil),
        UIBarButtonItem(title: "Post Reply", style: .done,
                  target: self, action: #selector(doneInput))
    ]
    textViewToolbar.sizeToFit()
    yourTextView.inputAccessoryView = textViewToolbar
}

@objc func cancelInput() { print("cancel") }
@objc func doneInput() { print("done") }

override func viewDidLoad() {
    super.viewDidLoad()
    addToolBarForTextView()
}

কল addToolBarForTextView () মধ্যে viewDidLoad অথবা অন্য কোনো জীবনচক্র পদ্ধতি।

মনে হয় এটি আমার জন্য নিখুঁত সমাধান ছিল।

চিয়ার্স,

murat


1
2019 এর জন্য এখন অনুলিপি করুন এবং পেস্ট করুন, কোনও সিনট্যাক্স ত্রুটি এবং বর্তমান নামকরণ নেই
ফ্যাটি

1
এখন পর্যন্ত এখানে সেরা উত্তর। আমি কেবল সাধারণ সিনট্যাক্স ত্রুটিটি ঠিক করেছি, অবশ্যই আপনার ইচ্ছামত সম্পাদনা করুন। ধন্যবাদ!
ফ্যাটি

2

ঠিক আছে. প্রত্যেকে কৌশল সহ উত্তর দিয়েছিল তবে আমি মনে করি এটি অর্জনের সঠিক উপায়টি

নিম্নলিখিত ক্রিয়াকলাপটি " প্রস্থান শেষ হয়ে গেল " ইভেন্টের সাথে সংযুক্ত করে Interface Builder। ( নীচের পদ্ধতিটি ' প্রস্থানTextField থেকে শেষ ' থেকে নীচের পদ্ধতিতে ডান ক্লিক করুন এবং cntrl- টানুন ।

-(IBAction)hideTheKeyboard:(id)sender
{
    [self.view endEditing:TRUE];
}

6
-1 প্রশ্নটি ইউআইটিেক্সটভিউ সম্পর্কে এবং ইউআইটিএফেক্সট আমার বন্ধু নয়
যোগী

2
এগুলির বেশিরভাগ উত্তর এখানে ভোট সহ হয় কারণ এটি বিভিন্ন বিকাশকারীদের বিভিন্ন দৃশ্যের সাথে স্যুট করে।
কার্বনার

আপনি যদি কোনও ইউআইটিেক্সটফিল্ড ব্যবহার করেন তবে এটি করার উপায় এটি। বিটিডব্লিউ, আপনার অবজেক্টিভ সি বোলগুলির জন্য হ্যাঁ / কোনও ব্যবহার করা উচিত, সত্য / মিথ্যা নয়।
জন শিয়ার

1
@ জশিয়ার: সত্য / মিথ্যাও ঠিক আছে
যোগী

2

অন্যান্য উত্তরগুলির সাথে সিমুলারটি ব্যবহার করে UITextViewDelegateতবে নতুন সুইফট ইন্টারফেসটি হ'ল isNewline:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if let character = text.first, character.isNewline {
        textView.resignFirstResponder()
        return false
    }
    return true
}

1
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range  replacementText:(NSString *)text
{
    if (range.length==0) {
        if ([text isEqualToString:@"\n"]) {
            [txtView resignFirstResponder];
            if(textView.returnKeyType== UIReturnKeyGo){

                [self PreviewLatter];
                return NO;
            }
            return NO;
        }
    }   return YES;
}

1
+ (void)addDoneButtonToControl:(id)txtFieldOrTextView
{
    if([txtFieldOrTextView isKindOfClass:[UITextField class]])
    {
        txtFieldOrTextView = (UITextField *)txtFieldOrTextView;
    }
    else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
    {
        txtFieldOrTextView = (UITextView *)txtFieldOrTextView;
    }

    UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0,
                                                                          0,
                                                                          [Global returnDeviceWidth],
                                                                          50)];
    numberToolbar.barStyle = UIBarStyleDefault;


    UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btn_return"]
                                                                style:UIBarButtonItemStyleBordered
                                                               target:txtFieldOrTextView
                                                               action:@selector(resignFirstResponder)];

    numberToolbar.items = [NSArray arrayWithObjects:btnDone,nil];
    [numberToolbar sizeToFit];

    if([txtFieldOrTextView isKindOfClass:[UITextField class]])
    {
         ((UITextField *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
    }
    else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
    {
         ((UITextView *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
    }
}

0

আমি জানি যে এটি এই প্রশ্নের সঠিক উত্তর নয়, তবে একটি উত্তরের জন্য ইন্টারনেট শিকার করার পরে আমি এই থ্রেডটি পেয়েছি। আমি অনুভব করি অন্যরাও এই অনুভূতিটি ভাগ করে নিয়েছে।

এটি ইউআইটিএপপেশারআরকনগাইজারের আমার বৈকল্পিক যা আমি নির্ভরযোগ্য এবং সহজেই ব্যবহারযোগ্য বলে মনে করি - কেবলমাত্র টেক্সটভিউয়ের প্রতিনিধিটিকে ভিউকন্ট্রোলারের কাছে সেট করুন।

টেক্সটভিউ সম্পাদনা করার জন্য সক্রিয় হয়ে গেলে ViewDidLoad এর পরিবর্তে আমি UITapGestureR সনাক্তকারীকে যুক্ত করব:

-(void)textViewDidBeginEditing:(UITextView *)textView{
    _tapRec = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];

    [self.view addGestureRecognizer: _tapRec];
    NSLog(@"TextView Did begin");
}

আমি যখন টেক্সটভিউয়ের বাইরে ট্যাপ করি তখন ভিউটি সম্পাদনা মোডটি শেষ করে এবং ইউআইটিএপজেস্টাররেকগনিজার নিজেই সরিয়ে দেয় যাতে আমি ভিউতে অন্যান্য নিয়ন্ত্রণের সাথে ইন্টারঅ্যাক্ট চালিয়ে যেতে পারি।

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: YES];
    [self.view removeGestureRecognizer:tapRec];
    NSLog(@"Tap recognized, tapRec getting removed");
}

আশা করি এটা কাজে লাগবে. এটি খুব সুস্পষ্ট বলে মনে হচ্ছে তবে আমি এই সমাধানটি ওয়েবে কোথাও দেখিনি - আমি কি কিছু ভুল করছি?


0

টেক্সটভিউয়ের জন্য প্রতিনিধি সেট করতে ভুলবেন না - অন্যথায় পদত্যাগকারী প্রথম কাজ করবে না।



0

এক্সকোড 6.4 এর জন্য For :

   override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
    {
        super.touchesBegan(touches, withEvent: event)
        if let touch = touches.first as? UITouch
        {
            self.meaningTextview.resignFirstResponder()
        }
    }

0

আপনার যোগ করা উচিত UIToolbarব্যবহার না করে সহজ করার জন্য আপনার শীর্ষে ইউআইটিেক্সটভিউতে করাshouldChangeTextIn

সুইফ্ট 4 এ

let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
        toolbar.barStyle = .default
        toolbar.items = [
            UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
            UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(doneAction))
        ]
        textView.inputAccessoryView = toolbar
@objc func doneAction(){
 self.textView.resignFirstResponder()
}

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