ইউআইটিএবলভিউয়ের পটভূমিকে স্পর্শ করে কীবোর্ড খারিজ করুন


105

আমার UITableViewসাথে একটি UITextFieldসেল রয়েছে as যখন পটভূমিটি UITableViewস্পর্শ করা হয় তখন আমি কীবোর্ডটি খারিজ করতে চাই । আমি একটি UIButtonআকার তৈরি UITableViewকরে এটির পিছনে রেখে চেষ্টা করার চেষ্টা করছি UITableView। কেবলমাত্র সমস্যাটি হ'ল UIButtonসমস্ত স্পর্শগুলি ধরা যখন এমনকি স্পর্শটি ইউআইটিবেল ভিউতে থাকে। আমি কি ভুল করছি?

ধন্যবাদ!



এটি সর্বোত্তম উত্তর stackoverflow.com/a/12851794/1418457
onmyway133

উত্তর:


203

এটি সহজেই তৈরি করে একটি তৈরি করা হয় ইউআইটিপজেস্টারআর সনাক্তকারী অবজেক্ট (ডিফল্টরূপে এটি একটি "অঙ্গভঙ্গি" সনাক্ত করবে সুতরাং আরও কাস্টমাইজেশন প্রয়োজন হবে না), অঙ্গভঙ্গিটি যখন বহিস্কার করা হবে তার জন্য একটি লক্ষ্য / ক্রিয়া নির্দিষ্ট করে এবং তারপরে অঙ্গভঙ্গি সনাক্তকারী বস্তু সংযুক্ত করে আপনার টেবিল দেখুন।

যেমন সম্ভবত আপনার viewDidLoadপদ্ধতিতে:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[self.tableView addGestureRecognizer:gestureRecognizer];

এবং hideKeyboardপদ্ধতিটি এর মতো দেখতে পারে:

- (void) hideKeyboard {
    [textField1 resignFirstResponder];
    [textField2 resignFirstResponder];
    ...
    ...
}

মনে রাখবেন যে কোনও জিনিসের অভ্যন্তরে স্পর্শ করার সময় অঙ্গভঙ্গিটি গুলি করা হয় না UITextField। এটি UITableViewব্যাকগ্রাউন্ডে, পাদলেখের দর্শন, শিরোলেখের দর্শন এবং UILabelsঅভ্যন্তরীণ কোষ ইত্যাদিতে চালিত is


4
আমি যখন এটি চেষ্টা করেছি তখন দেখতে পেলাম এটি টেবিলটি সেল নির্বাচন করা থেকে বিরত করেছে :( অন্যথায় দুর্দান্ত সমাধান
ব্রায়ান

109
সমাধান নমুনা হিসাবে উল্লেখ করে আপনি এই কাজটি সেট করে আরও ভাল করে তুলতে পারেন:gestureRecognizer.cancelsTouchesInView = NO;
জেবস

3
এবং একবার টেবিল ভিউয়ের সাথে সংযুক্ত হওয়ার পরে অঙ্গভঙ্গি সনাক্তকারীকে প্রকাশ করতে ভুলবেন না।
পল লিঞ্চ

39
জন্য hideKeyboardপদ্ধতি, পরিবর্তে পাঠ্য ক্ষেত্রের সাথে সরাসরি যোগাযোগ আপনি কি করতে পারেন [self.view endEditing:NO];। অ্যাপল ডক্স থেকে: " এই পদ্ধতিটি বর্তমানে প্রথম প্রতিক্রিয়াশীল এমন পাঠ্য ক্ষেত্রের জন্য বর্তমান ভিউ এবং এর সংক্ষিপ্ত চিত্রক্রমের দিকে নজর রাখে it যদি এটির সন্ধান করে তবে এটি পাঠ্য ক্ষেত্রটিকে প্রথম প্রতিক্রিয়াকারী হিসাবে পদত্যাগ করতে বলে If যদি বলের পরামিতি সেট করা থাকে হ্যাঁ, পাঠ্য ক্ষেত্রটি কখনও জিজ্ঞাসা করা হয় না; এটি পদত্যাগ করতে বাধ্য হয় ""
গোবোট ২

1
এইভাবে আমার "didSelectRowAtIndexPath" পদ্ধতিটি কল করা হচ্ছে না। এর কোন সমাধান ??
uniruddh

127

আপনি যদি সেট করেন তবে ইউআইটিএপপেশারআরগনাইজার সারণী ঘর নির্বাচন নিয়ে কাজ করে:

gestureRecognizer.cancelsTouchesInView = NO;

1
এটি ঘরের স্পর্শ করতে দেয়, তবে অঙ্গভঙ্গিটিও স্বীকৃতি পেয়েছে, সম্ভবত আমাদের এই প্রতিনিধি পদ্ধতিগুলি প্রয়োগ করতে হবেshouldReceiveTouch
onwayway133

61

এটি করার সর্বোত্তম উপায় এখানে। শুধু এই কাজ

[self.view endEditing:YES];

অথবা

[[self.tableView superView] endEditing:YES];

আমি এই কোডটি কোথায় রাখব? দুঃখিত আমি শিক্ষানবিস এবং দয়া করে সুইফট কোড সরবরাহ করুন।
জন

54

আপনি স্টোরিবোর্ড থেকে এটি করতে পারেন: এখানে চিত্র বর্ণনা লিখুন


1
আমি যা যা বেছে নিই: টেনে আনলে খারিজ করুন, ইন্টারেক্টিভভাবে বরখাস্ত করুন, আমি যখন টেবিলের ঘরটি স্পর্শ করি তখন এটি নির্বাচন করা হয়। আমি এক্সকোড 8, সুইফট 3 ব্যবহার করছি দয়া করে সহায়তা করুন
জন

22

হিসাবে UITableViewএকটি উপশ্রেণী হয় UIScrollView, বাস্তবায়নে নিচের প্রতিনিধি পদ্ধতি একটি অত্যন্ত সহজ, দ্রুত সমাধান প্রদান করে। এমনকি resignFirstResponderশ্রেণিবিন্যাসের অন্তর্দৃষ্টিগুলি দেখুন এবং বর্তমান প্রতিক্রিয়াশীলকে খুঁজে পান এবং এটির প্রতিক্রিয়াশীল স্থিতিকে পদত্যাগ করতে বলার পরেও জড়িত হওয়ার দরকার নেই ।

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}

এবং UIScrollViewDelegateহেডার ফাইল যুক্ত করতে মনে রাখবেন ।


2
আপনি যদি iOS7 এবং self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
তারপরে

আপনি যদি পর্দার নীচে এমন একটি পাঠ্যক্ষেত্রটিতে ট্যাপ করেন যা কী-বোর্ডটি দেখানোর জন্য উপরে স্ক্রোল করার কথা? - আপনার কীবোর্ডটি গোপন থাকবে।
ইসলাম প্র।

সুইফট 4 - self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
রবল্যাবগুলি

13

প্রথমত, scrollViewWillBeginDraggingআপনার যোগটি UIViewControllerযোগ করে শুনুন UIScrollViewDelegate:

.H ফাইলটিতে:

@interface MyViewController : UIViewController <UIScrollViewDelegate> 

.M ফাইলটিতে:

- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {

    [self dismissKeyboard];

}

তারপরে অন্যান্য মিথস্ক্রিয়া শুনুন:

- (void)setupKeyboardDismissTaps {

    UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeUpGestureRecognizer.cancelsTouchesInView = NO;
    swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
    [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];

    UISwipeGestureRecognizer *swipeDownGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeDownGestureRecognizer.cancelsTouchesInView = NO;
    swipeDownGestureRecognizer.direction = UISwipeGestureRecognizerDirectionDown;
    [self.tableView addGestureRecognizer:swipeDownGestureRecognizer];

    UISwipeGestureRecognizer *swipeLeftGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeLeftGestureRecognizer.cancelsTouchesInView = NO;
    swipeLeftGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.tableView addGestureRecognizer:swipeLeftGestureRecognizer];

    UISwipeGestureRecognizer *swipeRightGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeRightGestureRecognizer.cancelsTouchesInView = NO;
    swipeRightGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    [self.tableView addGestureRecognizer:swipeRightGestureRecognizer];


    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    tapGestureRecognizer.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tapGestureRecognizer];

}

তারপরে প্রয়োগ করুন dismissKeyboard:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    [yourTextFieldPointer resignFirstResponder];

}

এবং যদি, আমার মতো, আপনি একটি কাস্টম টেবিল ঘরের অভ্যন্তরে কোনও ইউআইটিেক্সটফিল্ডের জন্য কীবোর্ডটি খারিজ করতে চেয়েছিলেন:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    CustomCellClass *customCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    [customCell.textFieldInCell resignFirstResponder]; 

}

আশা করি যে কাউকে অনুসন্ধানে সহায়তা করবে !!



8

আপনার কোডিং আনন্দের জন্য এখানে দ্রুততম সংস্করণ:

এটি টেপ অঙ্গভঙ্গি সনাক্তকারী যুক্ত করে তারপরে কীবোর্ডটি খারিজ করে। টেক্সটফিল্ডের জন্য কোনও আউটলেট প্রয়োজন নেই!

override func viewDidLoad() {
    super.viewDidLoad()
    view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
}

func handleTap(sender: UITapGestureRecognizer) {
    if sender.state == .Ended {
        view.endEditing(true)
    }
    sender.cancelsTouchesInView = false
}

1
এটি এমনকি কাস্টম টেবিলভিউসেল দিয়েও কাজ করে! আমি এটি বের করার চেষ্টা করে অনেক সময় ব্যয় করেছি। তোমাকে অনেক ধন্যবাদ! আপনি আমার নায়ক. youtu.be/EqWRaAF6_WY
টাইপ

8

সেলগুলিতে টেপগুলি ব্লক না করে সুইফট 3 সংস্করণ রয়েছে।

ইন viewDidLoad()পদ্ধতি:

let dismissKeyboardGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
dismissKeyboardGesture.cancelsTouchesInView = false
tableView.addGestureRecognizer(dismissKeyboardGesture)

এবং এর hideKeyboardমতো দেখাচ্ছে:

func hideKeyboard() {
    view.endEditing(true)
}

7

আমি এটি এর মতো করেছিলাম:

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

- (BOOL)findAndResignFirstResonder:(UIView *)stView {
    if (stView.isFirstResponder) {
        [stView resignFirstResponder];
        return YES;     
    }

    for (UIView *subView in stView.subviews) {
        if ([self findAndResignFirstResonder:subView]) {
            return YES;
        }
    }
    return NO;
}

ইন tableView:didSelectRowAtIndexPath:পূর্ববর্তী পদ্ধতি কল:

- (void)tableView:(UITableView *)tableView
                             didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    [self findAndResignFirstResonder: self.view];
    ...
}

আপনি যেভাবে জিজ্ঞাসা করছেন আপনি এটি ভুল করছেন। আপনি এই

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

আমারও একই সমস্যা dাঁদ্রেয়ার মতো। যে didSelectRowAtIndexPathআগুন আপনি TableView নিজেই আলতো চাপুন না।
জেকেল

যদি সিলেক্টরোঅ্যাট ইন্ডেক্সপথ যথেষ্ট না হয় তবে টাচবেগনেও একই কাজ করুন!
আমোগ তালপল্লিকার

5

আমার একটি ছিল UITableViewControllerএবং বাস্তবায়ন touchesBegan:withEvent:আমার পক্ষে কাজ করে না।

এখানে কি কাজ করেছে:

সুইফট:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    view.endEditing(true)
}

উদ্দেশ্য গ:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.view endEditing:YES];
}

ভাল ধারণা, আমি এটি পছন্দ করি।
হটফজজসুন্ডে

4
@interface DismissableUITableView : UITableView {
}
@end

@implementation DismissableUITableView

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 [self.superview endEditing:YES];
 [super touchesBegan:touches withEvent:event];
}

@end

তারপরে নিশ্চিত হয়ে নিন যে আপনার নিব ফাইলটিতে আপনি আপনার ইউআইটিএলভিউয়ের ধরণটি ডিসমিসেবল ইউটিটেবল ভিউতে সেট করেছেন ..... সম্ভবত আমি এই শ্রেণীর জন্য আরও ভাল নামটি ভাবতে পারতাম, তবে আপনি বিষয়টিটি পেয়ে যাবেন।


4

আপনি যদি iOS7 টার্গেট করে থাকেন তবে আপনি নিম্নলিখিতগুলির একটি ব্যবহার করতে পারেন:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

প্রাক্তনটি কীবোর্ডটি অফ স্ক্রিনটি অ্যানিমেটেড করবে যখন টেবিল ভিউটি স্ক্রোল করা হবে এবং পরে স্টোর বার্তা অ্যাপ্লিকেশনটির মতো কীবোর্ডটি আড়াল করবে।

নোট করুন যে এগুলি থেকে এসেছে UIScrollView, যা UITableViewথেকে উত্তরাধিকার সূত্রে প্রাপ্ত।


সুন্দর। আমি কীবোর্ডটি নীচে নামতে শুরু না করা পর্যন্ত পর্দার উঁচু থেকে নীচে সোয়াইপ করে বাছাই করে পরিচালনা করি, কীবোর্ডটি কিছুটা উপরে না যাওয়া পর্যন্ত পিছনে সোয়াইপ করে, তারপরে ছেড়ে দেওয়া। স্ক্রোলভিউ যেমনটি করা উচিত তেমন শীর্ষে ফিরে আসে না।
স্যাম

3

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

viewDidLoad(){

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))

    tableView.addGestureRecognizer(tap)

}
//Calls this function when the tap is recognized.
@objc func dismissKeyboard() {

    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)

}

2

ইউআইটিএবলভিউ হ'ল ইউআইএসক্রোলভিউয়ের একটি সাবক্লাস।

আমি যেভাবে এটি করেছি তা হ'ল ব্যবহারকারীর দ্বারা একটি স্ক্রোল ইভেন্ট শোনার এবং তারপরে ফার্স্টরেসপন্ডারকে পদত্যাগ করা। আপনার কোডটিতে প্রয়োগের জন্য এখানে ইউআইএসক্রোলভিউ ডেলেগেট পদ্ধতি রয়েছে;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

এই ধরণের সমস্যার কাছে পৌঁছানোর সময় আমি সবচেয়ে ভাল উপায়টি খুঁজে পেয়েছি হ'ল প্রতিটি অবজেক্টের জন্য এবং পিতামাতার ক্লাসগুলির জন্য ডেলিগেট প্রোটোকলগুলি গবেষণা করা (এই ক্ষেত্রে ইউআইটিবেলভিউ ডিজিটেট, ইউআইএসক্রোলভিউডেলিগেট N এনএস অবজেক্টগুলিতে আগুনের ঘটনাগুলি বেশ বড় এবং ব্যাপক It's কোনও প্রোটোকল বাস্তবায়ন করা সহজ এবং তারপরে যেকোন কিছু সাবক্লাসিং করা।


2

আমারও একই সমস্যা ছিল এবং আমার সমাধানটি এখানে, এটি আমার পক্ষে নিখুঁতভাবে কাজ করে:

আপনি প্রয়োগ করেছেন এমন দৃশ্য বা দৃশ্যে নিয়ন্ত্রক <UITextFieldDelegate>

(আমার ক্ষেত্রে আমার একটা রীতি আছে UITableViewCell পাঠ্য ফিল্ডসেল নামে ),

UITapGestureRecognizerসম্পত্তি হিসাবে ঘোষণা করুন :

@interface TextFieldCell : UITableViewCell <UITextFieldDelegate>
{
    UITextField *theTextField;
    UITapGestureRecognizer *gestureRecognizer;
}
@property (nonatomic,retain) UITextField *theTextField;
@property (nonatomic,retain) UITapGestureRecognizer *gestureRecognizer; 

এবং আপনার দর্শন / নিয়ামক এ এটি আরম্ভ করুন:

self.gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard:)];

ইন - (void)textFieldDidBeginEditing:(UITextField *)textFieldপদ্ধতি, ব্যবহার superViewআপনার tableView এবং কল চলে যাওয়া addGestureRecognizer:

[self.superview.superview addGestureRecognizer:gestureRecognizer];

এবং এর মধ্যে - (void)textFieldDidEndEditing:(UITextField *)textField, কেবল অঙ্গভঙ্গি সনাক্তকারীকে সরিয়ে ফেলুন:

[self.superview.superview removeGestureRecognizer:gestureRecognizer];

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


এটা আমার জন্য এটি। ধন্যবাদ hac.jack
gilsaints88

2

আমি চেয়েছিলাম যে ঘরের কোনও অংশ নির্বাচন করা হলে আমার ঘরটি কীবোর্ডটি খুলুন এবং আপনি যদি ঘরে কোথাও ক্লিক করেন তবে এটি বন্ধ করে দিন। কীবোর্ড খোলার জন্য:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
    if (selected)
    {
        [self.textField becomeFirstResponder];
    }
}

(দ্রষ্টব্য: আমি ঘরটি উপবিয়োগ করেছি তবে আপনি tableView:didSelectRowAtIndexPath:প্রতিনিধি পদ্ধতিতে সহজেই এটি অর্জন করতে পারেনUITableView )

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

সমাধানটি নির্বাচিত সেলের ভিতরে ক্লিকটি ঘটেছে কিনা তা যাচাই করা হয়:

- (void)viewDidLoad
{
    [super viewDidLoad];
    //gesture recognizer to close the keyboard when user taps away
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(dismissKeyboard:)];
    tap.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tap];
}

-(void)dismissKeyboard:(UIGestureRecognizer*)tapGestureRecognizer
{
    if (!CGRectContainsPoint([self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]].frame, [tapGestureRecognizer locationInView:self.tableView]))
    {
        [self.view endEditing:YES];
    }
}

2

আমি একটি সমাধান পেয়েছি যা দুর্দান্ত কাজ করে।

ব্যবহার করতে প্রয়োজন হয় UIGestureRecognizerDelegate এবং পদ্ধতি - gestureRecognizer: shouldReceiveTouch:

টেক্সটভিউতে অঙ্গভঙ্গি শনাক্তকারীকে নীচে যুক্ত করুন:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
tapGestureRecognizer.cancelsTouchesInView = NO;
tapGestureRecognizer.delegate = self;
[self.suggestedTableView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if([touch.view isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    // UITableViewCellContentView => UITableViewCell
    if([touch.view.superview isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    // UITableViewCellContentView => UITableViewCellScrollView => UITableViewCell
    if([touch.view.superview.superview isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    return YES; // handle the touch
}

- (void) hideKeyboard{
    [textField resignFirstResponder];
}

2

UITableViewbackgroundViewসুইচ-এ নীচে দেখানো হয়েছে এমন একটি কার্যকর সম্পত্তি রয়েছে যার সাথে আমি সেল নির্বাচন নিয়ে গোলযোগ না করে এই আচরণটি অর্জন করেছি:

let tableBackTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
tableView.backgroundView = UIView()
tableView.backgroundView?.addGestureRecognizer(tableBackTapRecognizer)

1

আমি সমাধানটি সন্ধান করছিলাম এবং আমার কোড অনুসারে এমন কোনও কিছুই খুঁজে পেলাম না, তাই আমি এটি এরকম করেছিলাম:

http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap

এটি মূলত পূর্ব-বর্ণিত পদ্ধতির সংমিশ্রণ তবে কোনও কিছুর সাবক্লাস বা পটভূমির বোতাম তৈরি করার প্রয়োজন নেই।


1

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

// init
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapTableView:)];
tapRecognizer.cancelsTouchesInView = NO;
[self.tableView addGestureRecognizer:tapRecognizer];


// Hide on tap
- (void)didTapTableView:(UITapGestureRecognizer *)tap
{
    CGPoint point = [tap locationInView:tap.view];
    [self.view endEditing:!CGRectContainsPoint([self.tableView rectForRowAtIndexPath:[self.tableView indexPathForRowAtPoint:point]], point)];
}

scrollViewWillBeginDragging:ট্রিগার হওয়ার জন্য , টেবিলভিউয়ের scrollEnabledসম্পত্তি হওয়া উচিতYES

// Hide on scroll
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}

আমার জন্য একদম সঠিক. টেবিলভিউ সেলটিতে একটি টেক্সবক্স যুক্ত করা হয়েছে; যদি আমি কীবোর্ডের বাইরে ছুঁতে পারি তবে বরখাস্ত
নিকোলা

0

আপনি কেন পাঠ্যক্ষেত্র পূর্ণ একটি টেবিল তৈরি করতে চান? পাঠ্য ক্ষেত্রগুলি অন্তর্ভুক্ত প্রতিটি সারির জন্য আপনার একটি বিশদ ভিউ ব্যবহার করা উচিত। আপনি যখন আপনার বিশদ পর্যালোচনাটি চাপছেন, তখন নিশ্চিত হয়ে নিন যে আপনি "[মাই টেক্সটফিল্ড ফার্স্টরেসপন্ডার]" কল করেছেন যাতে ব্যবহারকারী সারণির তালিকা থেকে মাত্র একটি ক্লিকের সাথে সম্পাদনা শুরু করতে পারেন।


অ্যাপলের পরিচিতি অ্যাপ্লিকেশনটি ঠিক তা করে। আমি এটি প্রতি পাঠ্য ক্ষেত্রগুলিতে পূর্ণ বলব না , তবে এটি তাদের ভাল প্রভাবের জন্য ব্যবহার করে।
জো

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

0

আপনি যদি নিজের টেবিল ভিউ সাবক্লাস করতে চান (তবে!), এর মতো কিছু কাজ করতে পারে:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

   BOOL backgroundTouched = YES;

   for (UITouch *touch in touches) {
      CGPoint location = [touch locationInView:self];
      for (UITableViewCell *cell in self.visibleCells) {
         if (CGRectContainsPoint(cell.frame, location)) {
            backgroundTouched = NO;
            break;
         }
      }
   }

   if (backgroundTouched) {
      for (UITableViewCell *cell in self.visibleCells) {
         // This presumes the first subview is the text field you want to resign.
         [[cell.contentView.subviews objectAtIndex:0] resignFirstResponder];
      }
   }

   [super touchesBegan:touches withEvent:event];
}

0

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

- (BOOL)textFieldShouldReturn:(UITextField *)atextField
{
   [textField resignFirstresponder];
}

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

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(dismissKeyboard)];

    [self.view addGestureRecognizer:tap];

এখন কেবল নির্বাচক পদ্ধতিতে পদত্যাগের উত্তরকারী যুক্ত করুন:

-(void)dismissKeyboard 
{
    [textField resignFirstResponder];
}

আশা করি এটি সাহায্য করে, ধন্যবাদ :)


0

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

   /**
     *  Shortcut for resigning all responders and pull-back the keyboard
     */
    -(void)hideKeyboard
    {
        //this convenience method on UITableView sends a nested message to all subviews, and they resign responders if they have hold of the keyboard
        [self.tableView endEditing:YES];

    }

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

এর পরে আমরা বাইরের ট্যাপ অঙ্গভঙ্গির মাধ্যমে খারিজের যত্ন নিই:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self setupKeyboardDismissGestures];

}

- (void)setupKeyboardDismissGestures
{

//    Example for a swipe gesture recognizer. it was not set-up since we use scrollViewDelegate for dissmin-on-swiping, but it could be useful to keep in mind for views that do not inherit from UIScrollView
//    UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
//    swipeUpGestureRecognizer.cancelsTouchesInView = NO;
//    swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
//    [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];

    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
    //this prevents the gestureRecognizer to override other Taps, such as Cell Selection
    tapGestureRecognizer.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tapGestureRecognizer];

}

টেপগাস্টারআরকনগাইজার.ক্যান্সেলস টাচসইনভিউকে NO তে নির্ধারণ করা হ'ল অঙ্গভঙ্গি সনাক্তকারীকে ইউআইটিএবলভিউয়ের স্বাভাবিক অভ্যন্তরীণ কাজগুলিকে ওভাররাইড করা থেকে বিরত রাখা (উদাহরণস্বরূপ, সেল নির্বাচনের সাথে হস্তক্ষেপ না করা)।

অবশেষে, ইউআইটিবেবল ভিউ-এর উপরে / নিচে স্ক্রোলিংয়ে কীবোর্ডটি আড়াল করার জন্য, আমাদের অবশ্যই ইউআইএসক্রলভিউ ডেলিগেট প্রোটোকল স্ক্রোলভিউ উইলব্যাগিনড্র্যাগিং: পদ্ধতিটি প্রয়োগ করতে হবে:

.h ফাইল

@interface MyViewController : UIViewController <UIScrollViewDelegate>

.m ফাইল

#pragma mark - UIScrollViewDelegate

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self hideKeyboard];
}

আমি আসা করি এটা সাহায্য করবে! =)


0

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

static const CGFloat ANIMATION_DURATION = 0.4;
static const CGFloat LITTLE_SPACE = 5;
CGFloat animatedDistance;
CGSize keyboardSize;

@interface ViewController () <UITextFieldDelegate>
 @property (weak, nonatomic) IBOutlet UITextField *firstNameTXT;
  .....// some other text fields
 @property (weak, nonatomic) IBOutlet UITextField *emailTXT;
@end

@implementation ViewController
- (void)viewDidLoad{
.....
// add tap gesture to help in dismissing keyboard
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]
                                       initWithTarget:self
                                       action:@selector(tapScreen:)];// outside textfields

[self.view addGestureRecognizer:tapGesture];

// set text fields return key type to Next, last text field to Done
[self.firstNameTXT setReturnKeyType:UIReturnKeyNext];
.....
[self.emailTXT setReturnKeyType:UIReturnKeyDone];

// set text fields tags
[self.firstNameTXT setTag:0];
....// more text fields
[self.emailTXT setTag:5];

// add keyboard notification
[[NSNotificationCenter defaultCenter] addObserver:self     selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
}
[[NSNotificationCenter defaultCenter] addObserver:self      selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}

// dismiss keyboard when tap outside text fields
- (IBAction)tapScreen:(UITapGestureRecognizer *)sender {
  if([self.firstNameTXT isFirstResponder])[self.firstNameTXT resignFirstResponder];
  ...
  if([self.emailTXT isFirstResponder])[self.emailTXT  resignFirstResponder];

  }
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
   if(textField.returnKeyType==UIReturnKeyNext) {
     // find the text field with next tag
     UIView *next = [[textField superview] viewWithTag:textField.tag+1];
     [next becomeFirstResponder];
   } else if (textField.returnKeyType==UIReturnKeyDone || textField.returnKeyType==UIReturnKeyDefault) {
    [textField resignFirstResponder];
 }
return YES;
}

// Moving current text field above keyboard
-(BOOL) textFieldShouldBeginEditing:(UITextField*)textField{
   CGRect viewFrame = self.view.frame;
   CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
   CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];
   CGFloat textFieldBottomLine = textFieldRect.origin.y + textFieldRect.size.height + LITTLE_SPACE;//

   CGFloat keyboardHeight = keyboardSize.height;

   BOOL isTextFieldHidden = textFieldBottomLine > (viewRect.size.height - keyboardHeight)? TRUE :FALSE;
  if (isTextFieldHidden) {
    animatedDistance = textFieldBottomLine - (viewRect.size.height - keyboardHeight) ;
    viewFrame.origin.y -= animatedDistance;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
  }
  return YES;
}

-(void) restoreViewFrameOrigionYToZero{
  CGRect viewFrame = self.view.frame;
  if (viewFrame.origin.y != 0) {
    viewFrame.origin.y = 0;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
  }
}

-(void)keyboardDidShow:(NSNotification*)aNotification{
   NSDictionary* info = [aNotification userInfo];
   keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
 }

-(void)keyboardDidHide:(NSNotification*)aNotification{
   [self restoreViewFrameOrigionYToZero];// keyboard is dismissed, restore frame view to its  zero origin
}
@end

0

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

- (BOOL)findAndResignFirstResponder {
if (self.isFirstResponder) {
    [self resignFirstResponder];
    return YES;
}

    for (UIView *subView in self.subviews) {
        if ([subView findAndResignFirstResponder]) {
            return YES;
        }
    }
    return NO;
}

এবং আপনি এই পদ্ধতিটি আপনার ইউটিলিটি ক্লাসে রাখতে পারেন এবং ট্যাপ অঙ্গভঙ্গি থেকে @ মিক্সকার উত্তরের মতো ব্যবহার করতে পারেন ..


0

সুইফট 4 / 4.2 / 5

অন্য কোনও কিছু করার আগে - কোনও ঘর টেপ করা অবস্থায় আপনি কীবোর্ডটি খারিজও করতে পারেন।

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    view.endEditing(true)
    // Do something here
    }

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