UITableView स्क्रॉल करते समय कीबोर्ड छिपाएं


134

जब मैं UITableView स्क्रॉल करना शुरू करता हूं, तो मेरे ऐप में मैं कीबोर्ड छिपा देता हूं। मैं इंटरनेट पर इसके बारे में खोज करता हूं, और अधिकांश उत्तर UITableView (http://stackoverflow.com/questions/3499810/tapping-a-uiscrollview-to-hide-the-keyboard) को उपवर्गित कर रहा है।

मैंने उपवर्ग बनाए लेकिन यह काम नहीं है।

#import <UIKit/UIKit.h>

@protocol MyUITableViewDelegate <NSObject>
@optional
- (void)myUITableViewTouchesBegan;
@end

@interface MyUITableView : UITableView <UITableViewDelegate, UIScrollViewDelegate> {
    id<MyUITableViewDelegate> delegate;
}
@end

.m फ़ाइल

#import "MyUITableView.h"

@implementation MyUITableView

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    NSLog(@"delegate scrollView"); //this is dont'work
    [super scrollViewDidScroll:scrollView];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"delegate myUITableViewTouchesBegan"); // work only here
    [delegate myUITableViewTouchesBegan];
    [super touchesBegan:touches withEvent:event];

}

- (void)dealloc {
...

मैं इस तरह इस वर्ग का उपयोग करता हूं। लेकिन प्रतिनिधि कार्य myUITableViewTouchesBegan ViewController में काम नहीं करते हैं

#import <UIKit/UIKit.h>
#import "MyUITableView.h"

@interface FirstViewController : UIViewController <UITableViewDelegate, UISearchBarDelegate, MyUITableViewDelegate> {
    MyUITableView *myTableView;
    UISearchBar *searchBar; 
}

@property(nonatomic,retain) IBOutlet MyUITableView *myTableView;
...

।म

- (void) myUITableViewTouchesBegan{
    NSLog(@"myUITableViewTouchesBegan");
    [searchBar resignFirstResponder];
}

मुझे इस समस्या से कुछ परेशानी है:
1) myUITableViewTouchesBegan ViewController
2 में काम न करें) MyLITableView.m से NSLog - NSLog (@ "myUITableViewTouchesBegan प्रतिनिधि"); जब मैं टेबल को छूता हूं तब ही काम करता हूं। जब मैंने स्क्रॉल करना शुरू किया तो यह कैसे काम करता है?
मैं स्क्रॉल ओवरडायर्सक्रॉलर को ओवरराइड करने की कोशिश करता हूं, लेकिन कॉमाइलर ने कहा कि MyUITableVIew को इस स्ट्रिंग पर प्रतिक्रिया नहीं दी जा सकती है [सुपर स्क्रॉलव्यूडसक्रोल: स्क्रॉलव्यू];

जवाबों:


144

निश्चित नहीं है कि आपको इसके लिए UITableView को उप-वर्ग करने की आवश्यकता क्यों है।

सादे UITableView वाले दृश्य नियंत्रक में, इसे जोड़ने का प्रयास करें:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [searchBar resignFirstResponder];
}

418

आईओएस 7.0 और इसके बाद के संस्करण में इसे प्राप्त करने का सबसे साफ तरीका है:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

या स्पर्श करते समय अंतःक्रियात्मक रूप से खारिज करना:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

या स्विफ्ट में:

tableView.keyboardDismissMode = .onDrag

अंतःक्रियात्मक रूप से खारिज करने के लिए:

tableView.keyboardDismissMode = .interactive

21
यह विशेषता निब और स्टोरीबोर्ड का उपयोग करने वालों के लिए निश्चित रूप से विशेषता निरीक्षक में सेट की जा सकती है।
JuJoDi

1
यार, मैं गुस्से में कुल मिला कर इसे एक अपडेट के रूप में याद किया, मैं अभी भी प्रोटोकॉल के साथ पुराने तरीके का उपयोग कर रहा था कि स्क्रॉलव्यू ने स्क्रॉल किया .... धन्यवाद मेरे आदमी!
टॉमस सायकोरा

3
जो लोग भूल जाते हैं, उनके लिए आपको अभी भी UITextfield के पहले उत्तरदाता को इस्तीफा देना होगा।
क्षितिज 23५'४

1
मैं 3 साल से iOS देव कर रहा हूं और मुझे अब तक इस बारे में पता नहीं था ... असत्य।
जैकब किंग

मैं इस सामान को कैसे याद करूं, शानदार!
2:25 पर ट्रैपर

129

आप इंटरफ़ेस बिल्डर में यह अधिकार कर सकते हैं। अपना चयन करें UITableViewऔर गुण निरीक्षक खोलें। स्क्रॉल दृश्य अनुभाग में ड्रैग पर डिसमिस करने के लिए कीबोर्ड फ़ील्ड सेट करें ।

यहाँ छवि विवरण दर्ज करें


धन्यवाद यू ने मेरी जान बचा ली!
सबोबिन

41

बस ऊपर के उत्तरों में एक अद्यतन जोड़ने के लिए। नीचे स्विफ्ट 1.2 में मेरे लिए काम किया

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag

या

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.Interactive

2

स्विफ्ट 5 के साथ

तालिका दृश्य स्क्रॉल करते समय कीबोर्ड को छिपाने और ठीक से संपादन बंद करने के लिए, हमें अभी भी दो प्रकार के उत्तरों को संयोजित करने की आवश्यकता है:

  1. उदाहरण के लिए IB में कीबोर्ड डिसकस मोड सेट करें (जैसा कि काइल ने समझाया) या ViewDidLoad()कोड में (जैसा कि पी ने समझाया गया है):
tableView.keyboardDismissMode = .onDrag
  1. पहले उत्तरदाता के रूप में इस्तीफा देने के लिए वर्तमान टेक्स्टफील्ड को बाध्य करें (जैसा कि वसीली के उत्तर में है)। हमें बस अपनी UITableViewControllerकक्षा में निम्नलिखित जोड़ना होगा
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if !tableView.isDecelerating {
            view.endEditing(true)
        }
    }

1

अपने नियंत्रक में कोड की एक पंक्ति लिखे बिना कार्य समाधान:

जैसा कि आपका सवाल केवल एक शर्त (स्क्रॉल पर) के साथ कीबोर्ड को संभालना है। लेकिन यहां मैं टेक्स्टफील्ड और कीबोर्ड को एक साथ संभालने के लिए एक समाधान की सिफारिश कर रहा हूं जो UIViewController, UITableView और UIScrollView के लिए आकर्षण की तरह काम करता है। दिलचस्प तथ्य यह है कि आपको कोड की किसी भी एक पंक्ति को लिखने की आवश्यकता नहीं है।

यहां आप जाते हैं: TPKeyboardAvoiding - कीबोर्ड और स्क्रॉल को संभालने के लिए एक भयानक समाधान


0

कार्य

जब स्विफ्ट 3 में UITableView स्क्रॉल करें तो कीबोर्ड को प्रोग्रामेटिक रूप से छिपाएं

विवरण

xCode 8.2.1, स्विफ्ट 3

उपाय

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if !tableView.isDecelerating {
        view.endEditing(true)
    }
}

पूरा नमूना

ViewController

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var searchBar: UISearchBar!


    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self
    }
}

// MARK: - UITableViewDataSource

extension ViewController: UITableViewDataSource {

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 100
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell =  UITableViewCell(style: .subtitle, reuseIdentifier: nil)
        cell.textLabel?.text = "Title"
        cell.detailTextLabel?.text = "\(indexPath)"
        return cell
    }
}

// MARK: - UITableViewDelegate

extension ViewController: UITableViewDelegate {

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if !tableView.isDecelerating {
            view.endEditing(true)
        }
    }
}

स्टोरीबोर्ड

<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11762" systemVersion="16D32" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
    <device id="retina4_7" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11757"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="tne-QT-ifu">
            <objects>
                <viewController id="BYZ-38-t0r" customClass="ViewController" customModule="stackoverflow_4399357" customModuleProvider="target" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <searchBar contentMode="redraw" translatesAutoresizingMaskIntoConstraints="NO" id="wU1-dV-ueB">
                                <rect key="frame" x="0.0" y="20" width="375" height="44"/>
                                <textInputTraits key="textInputTraits"/>
                            </searchBar>
                            <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" keyboardDismissMode="interactive" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="L52-4c-UtT">
                                <rect key="frame" x="0.0" y="64" width="375" height="603"/>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                            </tableView>
                        </subviews>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstItem="wU1-dV-ueB" firstAttribute="bottom" secondItem="L52-4c-UtT" secondAttribute="top" id="0WF-07-qY1"/>
                            <constraint firstAttribute="trailing" secondItem="wU1-dV-ueB" secondAttribute="trailing" id="3Mj-h0-IvO"/>
                            <constraint firstItem="wU1-dV-ueB" firstAttribute="leading" secondItem="L52-4c-UtT" secondAttribute="leading" id="8W5-9j-2Rg"/>
                            <constraint firstItem="wU1-dV-ueB" firstAttribute="trailing" secondItem="L52-4c-UtT" secondAttribute="trailing" id="crK-dR-UYf"/>
                            <constraint firstItem="wU1-dV-ueB" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="mPe-bp-Dxw"/>
                            <constraint firstItem="L52-4c-UtT" firstAttribute="bottom" secondItem="wfy-db-euE" secondAttribute="top" id="oIo-DI-vLh"/>
                            <constraint firstItem="wU1-dV-ueB" firstAttribute="top" secondItem="y3c-jy-aDJ" secondAttribute="bottom" id="tVC-UR-PA4"/>
                        </constraints>
                    </view>
                    <connections>
                        <outlet property="searchBar" destination="wU1-dV-ueB" id="xJf-bq-4t9"/>
                        <outlet property="tableView" destination="L52-4c-UtT" id="F0T-yb-h5r"/>
                    </connections>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-79.200000000000003" y="137.18140929535232"/>
        </scene>
    </scenes>
</document>

परिणाम

यहाँ छवि विवरण दर्ज करें


0

IOS 7 के बाद, आप टेबलव्यू प्रॉपर्टी का सरल उपयोग कर सकते हैं

स्विफ्ट 3.0+

myTableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag

उद्देश्य सी

myTableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

पुराने संस्करणों के लिए, स्क्रॉल दृश्य प्रतिनिधि को लागू करने से काम चल सकता है।

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        view.endEditing(true)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.