আইওএসে নামপ্যাড কীবোর্ডে কীভাবে একটি 'সম্পন্ন' বোতাম যুক্ত করা যায়


84

সুতরাং, নামপ্যাড কীবোর্ডটি ডিফল্টরূপে 'সম্পন্ন' বা 'নেক্সট' বোতামের সাথে আসে না তাই আমি একটি যুক্ত করতে চাই। আইওএস 6 এবং এর নীচে কীবোর্ডে একটি বোতাম যুক্ত করার জন্য কিছু কৌশল ছিল তবে তারা আইওএস 7 এ কাজ করছে বলে মনে হয় না।

প্রথমে আমি কীবোর্ডটি সাবস্ক্রাইব করে নোটিফিকেশন দেখাচ্ছে

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

কীবোর্ডটি প্রদর্শিত হলে আমি একটি বোতাম যুক্ত করার চেষ্টা করি:

- (void)keyboardWillShow:(NSNotification *)note 
{
    // create custom button
    UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeSystem];
    doneButton.frame = CGRectMake(0, 50, 106, 53);
    doneButton.adjustsImageWhenHighlighted = NO;
    [doneButton setTitle:@"Done" forState:UIControlStateNormal];
    [doneButton addTarget:self action:@selector(dismissKeyboard) forControlEvents:UIControlEventTouchUpInside];

    // locate keyboard view
    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    UIView* keyboard;
    for(int i=0; i<[tempWindow.subviews count]; i++) 
    {
        keyboard = [tempWindow.subviews objectAtIndex:i];
        // keyboard view found; add the custom button to it
        if([[keyboard description] hasPrefix:@"UIKeyboard"] == YES)
        [keyboard addSubview:doneButton];
    }
}

তবে লুপটি চালায় না কারণ এটি কোনও সংক্ষিপ্তসার খুঁজে পাচ্ছে না। কোনও পরামর্শ? আমি আইওএস 7 এর জন্য কোনও সমাধান খুঁজে পাইনি তাই আমি কি করানোর কথা বলার অন্য কোনও উপায় আছে?

সম্পাদনা করুন: টুলবার ছেলেদের জন্য সমস্ত পরামর্শের জন্য ধন্যবাদ তবে আমি বরং এই রুটটি নামব না কারণ আমি যথেষ্ট জায়গা দরিদ্র (এবং এটি কুৎসিত)।


এই পোস্টে চেষ্টা করেছেন? neoos.ch/blog/…
অনিল

@ আইনিল ইউআইকিবোর্ডকে অনুকূলিতকরণের সেই উপায়টি আপেল দ্বারা নিষিদ্ধ।
ghargavḯ

UIKeyboardDidShowNotifications দিয়ে পরীক্ষা করুন।
প্রবীণ মতনাম


4
আমি সত্যিই কোনও সরঞ্জামদণ্ড যুক্ত করতে চাই না, আমি কীবোর্ডের ডানদিকে বোতামটি রাখতে চাই।
জর্জ ম্যাককিবিন

উত্তর:


26

এটি iOS7 নাম্বার-কিপ্যাডে সম্পন্ন বোতামটি প্রজেক্ট করার একটি সহজ উপায়। ইউআইটিেক্সটফিল্ডের নীচের প্রতিনিধি পদ্ধতিতে কীবোর্ড শোয়ের জন্য একটি বিজ্ঞপ্তি যুক্ত করুন।

-(void)textFieldDidBeginEditing:(UITextField *)textField {

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

এখন keyboardWillShowনীচের মতো পদ্ধতিটি প্রয়োগ করুন । এখানে আমাদের iOS7 এর জন্য অতিরিক্ত যত্ন নেওয়া দরকার।

- (void)keyboardWillShow:(NSNotification *)note {
// create custom button
UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
doneButton.frame = CGRectMake(0, 163, 106, 53);
doneButton.adjustsImageWhenHighlighted = NO;
[doneButton setImage:[UIImage imageNamed:@"doneButtonNormal.png"] forState:UIControlStateNormal];
[doneButton setImage:[UIImage imageNamed:@"doneButtonPressed.png"] forState:UIControlStateHighlighted];
[doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    dispatch_async(dispatch_get_main_queue(), ^{
        UIView *keyboardView = [[[[[UIApplication sharedApplication] windows] lastObject] subviews] firstObject];
        [doneButton setFrame:CGRectMake(0, keyboardView.frame.size.height - 53, 106, 53)];
        [keyboardView addSubview:doneButton];
        [keyboardView bringSubviewToFront:doneButton];

        [UIView animateWithDuration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]-.02
                              delay:.0
                            options:[[note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]
                         animations:^{
                             self.view.frame = CGRectOffset(self.view.frame, 0, 0);
                         } completion:nil];
    });
}else {
    // locate keyboard view
    dispatch_async(dispatch_get_main_queue(), ^{
        UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
        UIView* keyboard;
        for(int i=0; i<[tempWindow.subviews count]; i++) {
            keyboard = [tempWindow.subviews objectAtIndex:i];
            // keyboard view found; add the custom button to it
            if([[keyboard description] hasPrefix:@"UIKeyboard"] == YES)
                [keyboard addSubview:doneButton];
        }
    });
  }
}

SYSTEM_VERSION সনাক্ত করতে এখন এই ম্যাক্রোটিকে উপযুক্ত শিরোনামে যুক্ত করুন

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)


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

SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO কেন এনএসফাউন্ডেশন ভার্সন নাম্বার> এনএসফাউন্ডেশন ভার্সন নাম্বার_আইওএস_6_0 নয়? এবং আমি এটি পরীক্ষা করেছি, এনএসফাউন্ডেশন ভার্সন নাম্বার_আইওএস_5_0 আরও ভাল
govo

dispatch_async এখানে কীবোর্ড হ্যাক করার জন্য সবচেয়ে নির্ভরযোগ্য পদ্ধতি নয়। :(
বেন আফ্লেক

7
আইওএস 8-তে এই কী বোতামটি লুকিয়ে নেই, কীবোর্ডকে বরখাস্ত করার পরে।
হেমন্ত চিত্তোড়া

4
এই উত্তরটি, চতুর হলেও ভাঙতে বাধ্য ছিল।
সুইফট আরকিটেক্ট

187

অনেক নিরাপদ পদ্ধতির একটি ব্যবহার করা UIToolBarসঙ্গে Doneযেমন বাটন inputAccessoryView


কোডের উদাহরণ :

UIToolbar *keyboardDoneButtonView = [[UIToolbar alloc] init];
[keyboardDoneButtonView sizeToFit];
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                               style:UIBarButtonItemStyleBordered target:self
                                                              action:@selector(doneClicked:)];
[keyboardDoneButtonView setItems:[NSArray arrayWithObjects:doneButton, nil]];
txtField.inputAccessoryView = keyboardDoneButtonView;

আপনার -doneClickedপদ্ধতিটি দেখতে এমন হওয়া উচিত:

- (IBAction)doneClicked:(id)sender
{
    NSLog(@"Done Clicked.");
    [self.view endEditing:YES];
}

নমুনা কোড সুইফট:

let keyboardDoneButtonView = UIToolbar.init()
keyboardDoneButtonView.sizeToFit()
let doneButton = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.Done, 
                                                   target: self, 
                                                   action: Selector("doneClicked:")))    

keyboardDoneButtonView.items = [doneButton]
textFieldInput.inputAccessoryView = keyboardDoneButtonView

আপনার -doneClickedপদ্ধতিটি দেখতে এমন হওয়া উচিত:

func doneClicked(sender: AnyObject) {
  self.view.endEditing(true)
}

আমি এই কাজ শেষ হতে পারে। এটি কতটা জায়গা নেয় তা আমি সত্যিই পছন্দ করি না।
জর্জ ম্যাককিবিন

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

যখন আমি এটি করি, আমি কেবল আমার পর্দার একেবারে নীচে টুলবারটি পাই এবং কীবোর্ড আর প্রদর্শিত হবে না। ভাবনা?
ক্রিস

দুর্দান্ত উত্তর, কেবলমাত্র একটি টিবিবিট, অ্যারে উইথঅবজেক্টস অক্ষরহীনভাবে আক্ষরিক পক্ষে অনুধাবন করা হয়েছে: [এনএসআর অ্যারে উইথঅবজেক্টস: ডাবডটন, নীল] => @ [সম্পন্ন বাটন]
অস্টিন

4
আইওএস 8.0 থেকে UIBarButtonItemStyleBorderedঅবহেলিত ব্যবহার UIBarButtonItemStyleDoneবাUIBarButtonItemStylePlain
নাজির

131

এমনকি সহজ উপায়:

সুইফট ৩.০ এবং এর বেশি :

func addDoneButton() {
    let keyboardToolbar = UIToolbar()
    keyboardToolbar.sizeToFit()
    let flexBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
        target: nil, action: nil)
    let doneBarButton = UIBarButtonItem(barButtonSystemItem: .done,
        target: view, action: #selector(UIView.endEditing(_:)))
    keyboardToolbar.items = [flexBarButton, doneBarButton]
    textField.inputAccessoryView = keyboardToolbar
}

সুইফট 2.3 এবং নীচে :

func addDoneButton() {
    let keyboardToolbar = UIToolbar()
    keyboardToolbar.sizeToFit()
    let flexBarButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace,
        target: nil, action: nil)
    let doneBarButton = UIBarButtonItem(barButtonSystemItem: .Done,
        target: view, action: #selector(UIView.endEditing(_:)))
    keyboardToolbar.items = [flexBarButton, doneBarButton]
    textField.inputAccessoryView = keyboardToolbar
}

উদ্দেশ্য সি :

- (void)addDoneButton {
    UIToolbar* keyboardToolbar = [[UIToolbar alloc] init];
    [keyboardToolbar sizeToFit];
    UIBarButtonItem *flexBarButton = [[UIBarButtonItem alloc]
    initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
    target:nil action:nil];
    UIBarButtonItem *doneBarButton = [[UIBarButtonItem alloc]
    initWithBarButtonSystemItem:UIBarButtonSystemItemDone
    target:self.view action:@selector(endEditing:)];
    keyboardToolbar.items = @[flexBarButton, doneBarButton];
    self.textField.inputAccessoryView = keyboardToolbar;
}

সম্পাদনা:

আমি ডিসিকিট নামে একটি দরকারী গ্রন্থাগার তৈরি করেছি , যার সরঞ্জাম বাক্সটি ইতিমধ্যে বাক্সের বাইরে রয়েছে:

IOS এ কীবোর্ডের উপরে সম্পন্ন সরঞ্জামদণ্ড (ডিসিকিট লাইব্রেরি ব্যবহার করে)

এটিতে আরও অনেক দুর্দান্ত বৈশিষ্ট্য রয়েছে।


4
আমার কাছে দেখে মনে হচ্ছে আপনি 1 বছর আগে থেকে নতুন উত্তর হিসাবে ভাভিনের উত্তরে একটি ফ্লেক্স বার বোতাম যুক্ত করেছিলেন যাতে আমি বুঝতে পারি যে কেন কেউ নীচে ভোট দিয়েছে। আমিও এখানে কিছু মিস করেছি?
মার্ক ম্যাককর্কল

4
হ্যাঁ, আমি ব্যবহার করি না initWithTitle:@"Done", initWithBarButtonSystemItem:UIBarButtonSystemItemDoneপরিবর্তে আমি ব্যবহার করি । এটি স্ট্যান্ডার্ড অ্যাপলের ডোন বার বোতামটি ফিরিয়ে দেবে।
তদ্ব্যতীত

4
এটি পূর্বের সঠিক উত্তর আইএমওতে উন্নতি (মন্তব্য) হিসাবে যুক্ত করা উচিত বা ভোট প্রত্যাশা করা উচিত। একটি নতুন উত্তরের মূল প্রশ্নের ভিন্ন ভিন্ন দৃষ্টিভঙ্গি জড়িত হওয়া উচিত, কোনও বিদ্যমান প্রশ্নের উন্নতি নয়। তবুও, উন্নতির জন্য আপনাকে ধন্যবাদ। ;-)
মার্ক ম্যাককর্কল

4
না, আমি এটা মনে করি না। মন্তব্যগুলি কোড লেখার জন্য ব্যবহার করা হবে না বলে মনে করা হয় :)
আন্দ্রে গর্ডিভ

13

উপরের উত্তরগুলির উপর কেবল সুইফ্ট সংস্করণটি তৈরি করা যেহেতু আমাকে এটি অনুবাদ করতে হয়েছিল:

   @IBOutlet weak var numberTextField: UITextField!

    override func viewDidLoad() {
        addDoneButtonTo(numberTextField)
    }

    // MARK: Done for numberTextField

    private func addDoneButtonTo(textField: UITextField) {
        let flexBarButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
        let doneBarButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: "didTapDone:")
        let keyboardToolbar = UIToolbar()
        keyboardToolbar.sizeToFit()
        keyboardToolbar.items = [flexBarButton, doneBarButton]
        textField.inputAccessoryView = keyboardToolbar
    }

    func didTapDone(sender: AnyObject?) {
        numberTextField.endEditing(true)
    }

3

তুমি ব্যবহার করতে পার

myTextField.inputAccessoryView = _ ইনপুটভিউ;

ইনপুট অ্যাকসেসরির ভিউ এমন একটি দৃশ্য যা সর্বদা কীবোর্ডের উপরে আসে এবং এর সাথে বরখাস্ত হয় [textfield resignFirstResponder]

করা doneইনপুট দর্শন উপর এবং textfields এর resignfirst উত্তর প্রদানকারী সঞ্চালন।


2

শুধু ব্যবহার

আপনার টেক্সটফিল্ড.इनপুটঅ্যাকসেসরিভিউ

আশা করি আপনি সাহায্য করবেন


2
enter code here

1. register the controller to the notification

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // Keyboard events
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

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

2. don't forget to remove the controller from the notification centre

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.view endEditing:YES];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

3. implement keyboard notification handlers

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

// create custom button
    UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    doneButton.frame = CGRectMake(0, 107, 106, 53);
    [doneButton setTitle:@"Done" forState:UIControlStateNormal];
    [doneButton addTarget:self  action:@selector(doneButton:)forControlEvents:UIControlEventTouchUpInside];

// save the reference to the button in order to use it in keyboardWillHide method
   self.donekeyBoardBtn = doneButton;

// to my mind no need to search for subviews
   UIWindow *windowContainigKeyboard = [[[UIApplication sharedApplication] windows]  lastObject];
   [windowContainigKeyboard addSubview:self.donekeyBoardBtn];
   self.donekeyBoardBtn.frame = CGRectMake(0., CGRectGetHeight(w.frame) -  CGRectGetHeight(self.donekeyBoardBtn.frame), CGRectGetWidth(self.donekeyBoardBtn.frame), CGRectGetHeight(self.donekeyBoardBtn.frame));
}

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

    [self.donekeyBoardBtn removeFromSuperview];
}

4. implement done button action

- (void)doneButton:(id)sender{
   // add needed implementation
      [self.view endEditing:YES]; 
}

আমি আপনার উত্তরটি আমার যা করতে হবে তার সাথে খুব মিল খুঁজে পেয়েছি। ধন্যবাদ বোতাম কোনও অ্যানিমেটেড অবজেক্ট হিসাবে আসে না, যখন কীবোর্ড শো হয়।
অর্পিত বি পরেক

1

আইপ্যাড "নম্বর" প্যাডে রিটার্ন কী প্রয়োগ করে আপনি ফোন বা আইপ্যাডে রয়েছেন কিনা তা আপনাকে সনাক্ত করতে হবে


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