Nascondi tastiera quando scorri UITableView


134

Nella mia app voglio nascondere la tastiera quando inizio a scorrere UITableView. Cerco questo su Internet e la maggior parte delle risposte è la sottoclasse di UITableView (http://stackoverflow.com/questions/3499810/tapping-a-uiscrollview-to-hide-the-keyboard).

Ho creato una sottoclasse ma non funziona.

#import <UIKit/UIKit.h>

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

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

.m file

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

Uso questa classe in questo modo. Ma la funzione delegata myUITableViewTouchesBegan non funziona 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];
}

Ho qualche problema con questa implementazione:
1) myUITableViewTouchesBegan non funziona in ViewController
2) NSLog da MyUITableView.m - NSLog (@ "delegate myUITableViewTouchesBegan"); funziona solo quando tocco la tabella. Come ha funzionato anche quando ho iniziato a scorrere?
Provo a sovrascrivere scrollViewDidScroll ma comiler ha detto che MyUITableVIew potrebbe non rispondere su questa stringa [super scrollViewDidScroll: scrollView];

Risposte:


144

Non sono sicuro del motivo per cui devi sottoclassare UITableView per questo.

Nel controller di visualizzazione che contiene il semplice UITableView, prova ad aggiungere questo:

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

418

Ecco il modo più pulito per raggiungere questo obiettivo in iOS 7.0 e versioni successive:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

O per chiudere in modo interattivo quando si tocca:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

O in Swift:

tableView.keyboardDismissMode = .onDrag

Per chiudere in modo interattivo:

tableView.keyboardDismissMode = .interactive

21
Questo attributo può ovviamente essere impostato anche nella finestra di ispezione degli attributi per coloro che usano pennini e storyboard.
JuJoDi,

1
Amico, mi sono perso totalmente come un aggiornamento, sto ancora usando il vecchio stile con protocollo che scrollview ha fatto scorrere .... Grazie amico!
Tomas Sykora,

3
Per coloro che dimenticano, è comunque necessario che UITextfield si dimetta dal primo risponditore.
skyline75489,

1
Faccio iOS dev da 3 anni e non lo sapevo fino ad ora ... irreale.
Jacob King,

Come mi manca questa roba, geniale!
trapper

129

Puoi farlo direttamente in Interface Builder. Seleziona il tuo UITableViewe apri la finestra degli attributi. Nella sezione Vista di scorrimento impostare il campo Tastiera su Ignora al trascinamento .

inserisci qui la descrizione dell'immagine


Grazie mi hai appena salvato la vita!
Sabobin,

41

Solo per aggiungere un aggiornamento alle risposte sopra. Di seguito ha funzionato per me in Swift 1.2

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag

o

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.Interactive

2

Con Swift 5

Per nascondere la tastiera durante lo scorrimento di TableView e interrompere la modifica in modo corretto, è comunque necessario combinare due tipi di risposte:

  1. Imposta la modalità di eliminazione della tastiera in IB (come spiegato da Kyle ) o nel ViewDidLoad()codice (come spiegato da Pei ) per esempio:
tableView.keyboardDismissMode = .onDrag
  1. Forza il campo di testo corrente a rassegnare le dimissioni come primo risponditore (come nella risposta di Vasily ). Dobbiamo solo aggiungere quanto segue alla nostra UITableViewControllerclasse
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if !tableView.isDecelerating {
            view.endEditing(true)
        }
    }

1

Soluzione funzionante senza scrivere una singola riga di codice nel controller:

Poiché la tua domanda è quella di gestire la tastiera nascosta con una sola condizione (a scorrimento). Ma qui sto raccomandando una soluzione per gestire insieme il campo di testo e la tastiera che funziona come un fascino per UIViewController, UITableView e UIScrollView. Il fatto interessante è che non è necessario scrivere una singola riga di codice.

Ecco qua: TPKeyboardAvoiding - Una fantastica soluzione per gestire tastiera e scorrimento


0

Compito

Nascondi la tastiera a livello di codice quando scorri UITableView in Swift 3

Dettagli

xCode 8.2.1, rapido 3

Soluzione

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

Campione completo

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>

Risultato

inserisci qui la descrizione dell'immagine


0

Dopo iOS 7, puoi semplicemente utilizzare la proprietà tableview

Swift 3.0+

myTableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag

ObjectiveC

myTableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

Per le versioni precedenti, l'implementazione del delegato della vista di scorrimento potrebbe funzionare.

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        view.endEditing(true)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.