Tastatur ausblenden, wenn Sie durch UITableView scrollen

134

In meiner App möchte ich die Tastatur ausblenden, wenn ich mit dem Scrollen von UITableView beginne. Ich suche darüber im Internet und die meisten Antworten sind UITableView (http://stackoverflow.com/questions/3499810/tapping-a-uiscrollview-to-hide-the-keyboard).

Ich habe Unterklasse gemacht, aber es funktioniert nicht.

#import <UIKit/UIKit.h>

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

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

.m Datei

#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 {
...

Ich benutze diese Klasse so. Die Delegatenfunktion myUITableViewTouchesBegan funktioniert jedoch nicht in ViewController

.h

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

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

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

.m

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

Ich habe einige Probleme mit dieser Implementierung:
1) myUITableViewTouchesBegan funktioniert nicht in ViewController
2) NSLog von MyUITableView.m - NSLog (@ "delegate myUITableViewTouchesBegan"); Arbeite nur, wenn ich den Tisch berühre. Wie hat es funktioniert, auch wenn ich anfange zu scrollen?
Ich versuche, scrollViewDidScroll zu überschreiben, aber der Comiler hat gesagt, dass MyUITableVIew möglicherweise nicht auf diese Zeichenfolge reagiert [super scrollViewDidScroll: scrollView];

Olegi
quelle

Antworten:

144

Ich bin mir nicht sicher, warum Sie dafür UITableView unterordnen müssen.

Versuchen Sie im Ansichts-Controller, der die einfache UITableView enthält, Folgendes hinzuzufügen:

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

quelle
417

Hier ist der sauberste Weg, dies in iOS 7.0 und höher zu erreichen:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

Oder interaktiv beim Berühren entlassen:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

Oder in Swift:

tableView.keyboardDismissMode = .onDrag

Interaktiv entlassen:

tableView.keyboardDismissMode = .interactive
Pei
quelle
21
Dieses Attribut kann natürlich auch im Attributinspektor für Benutzer von Schreibfedern und Storyboards festgelegt werden.
JuJoDi
1
Alter, ich habe das als Update total verpasst, ich benutze immer noch die altmodische Methode mit dem Protokoll, dass die Bildlaufansicht gescrollt hat ... Danke, mein Mann!
Tomas Sykora
3
Für diejenigen, die vergessen, müssen Sie UITextfield noch dazu bringen, den Ersthelfer zurückzutreten.
skyline75489
Ich mache seit 3 ​​Jahren iOS-Entwickler und wusste bis jetzt nichts davon ... unwirklich.
Jacob King
Wie vermisse ich dieses Zeug, brillant!
Trapper
129

Sie können dies direkt im Interface Builder tun. Wählen Sie Ihre aus UITableViewund öffnen Sie den Attributinspektor. Stellen Sie im Abschnitt Bildlaufansicht die Tastatur ein Tastaturfeld auf Drag zu Entlassen .

Geben Sie hier die Bildbeschreibung ein

Kyle Clegg
quelle
Danke, du hast gerade mein Leben gerettet!
Sabobin
41

Nur um den obigen Antworten ein Update hinzuzufügen. Das Folgende hat in Swift 1.2 für mich funktioniert

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag

oder

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.Interactive
Gareth Jones
quelle
2

Mit Swift 5

Um die Tastatur beim Scrollen in der Tabellenansicht auszublenden und die Bearbeitung zu beenden, müssen noch zwei Arten von Antworten kombiniert werden:

  1. Stellen Sie den Tastatur-Entlassungsmodus in IB (wie Kyle erklärt hat) oder in ViewDidLoad()Code (wie Pei erklärt hat) ein, zum Beispiel:
tableView.keyboardDismissMode = .onDrag
  1. Zwingen Sie das aktuelle Textfeld als Ersthelfer zum Rücktritt (wie in Vasily ‚s Antwort). Wir müssen unserer UITableViewControllerKlasse nur Folgendes hinzufügen
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if !tableView.isDecelerating {
            view.endEditing(true)
        }
    }
Thierry G.
quelle
1

Arbeitslösung ohne Schreiben einer einzelnen Codezeile in Ihren Controller:

Da Ihre Frage ist, die Tastatur zum Ausblenden nur mit einer Bedingung zu behandeln (beim Scrollen). Aber hier empfehle ich eine Lösung, um Textfeld und Tastatur zusammen zu handhaben, die für UIViewController, UITableView und UIScrollView wie ein Zauber wirkt. Die interessante Tatsache ist, dass Sie keine einzige Codezeile schreiben müssen.

Los geht's: TPKeyboardAvoiding - Eine großartige Lösung für Tastatur und Bildlauf

iDevAmit
quelle
0

Aufgabe

Blenden Sie die Tastatur programmgesteuert aus, wenn Sie in Swift 3 durch UITableView scrollen

Einzelheiten

xCode 8.2.1, schnell 3

Lösung

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

Vollständige Probe

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)
        }
    }
}

StoryBoard

<?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>

Ergebnis

Geben Sie hier die Bildbeschreibung ein

Wassili Bodnarchuk
quelle
0

Nach iOS 7 können Sie einfach die tableview-Eigenschaft verwenden

Swift 3.0+

myTableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag

Ziel c

myTableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

In früheren Versionen könnte die Implementierung des Bildlaufansichtsdelegaten funktionieren.

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        view.endEditing(true)
}
varunrathi28
quelle