UITableView kaydırıldığında klavyeyi gizle


134

Benim app UITableView kaydırma başladığımda klavyeyi gizlemek istiyorum. Bu konuda internette arama yapıyorum ve çoğu cevap UITableView alt sınıflaması (http://stackoverflow.com/questions/3499810/tapping-a-uiscrollview-to-hide-the-keyboard).

Alt sınıf yaptım ama işe yaramıyor.

#import <UIKit/UIKit.h>

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

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

.m dosyası

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

Bu sınıfı böyle kullanıyorum. Ancak, temsilci işlevi myUITableViewTouchesBegan ViewController'da çalışmıyor

.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];
}

Bu uygulama ile bazı sorunları var:
1) myUITableViewTouchesBegan dont çalışma ViewController
2) NSLog MyUITableView.m - NSLog (@ "delegate myUITableViewTouchesBegan"); sadece masaya dokunduğumda çalışıyorum. Kaydırmaya başladığımda da nasıl işledi?
Ben geçersiz kılmak scrollViewDidScroll deneyin ama derleyici MyUITableVIew bu dizede yanıt vermeyeceğini söyledi [süper scrollViewDidScroll: scrollView];

Yanıtlar:


144

Bunun için neden UITableView alt sınıfını yapmanız gerektiğinden emin değilim.

Düz UITableView içeren görünüm denetleyicisinde şunu eklemeyi deneyin:

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

418

Bunu iOS 7.0 ve sonraki sürümlerde gerçekleştirmenin en temiz yolu:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

Veya dokunurken etkileşimli olarak kapatmak için:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

Veya Swift'te:

tableView.keyboardDismissMode = .onDrag

Etkileşimli olarak kapatmak için:

tableView.keyboardDismissMode = .interactive

21
Bu özellik elbette, uç ve film şeridi kullananların nitelik denetçisinde de ayarlanabilir.
JuJoDi

1
Ahbap, bir güncelleme olarak bu tamamen kaçırdım ucube, hala hala kaydırma görünümü kaydırma protokolü ile eski moda yolu kullanıyordum .... Teşekkürler dostum!
Tomas Sykora

3
Unutanlar için, yine de UITextfield'ın ilk yanıtlayıcıyı istifa etmesi gerekir.
skyline75489

1
3 yıldır iOS geliştiriyorum ve bunu şimdiye kadar bilmiyordum ... gerçek dışı.
Jacob King

Bu şeyleri nasıl özlüyorum, parlak!
tuzakçı

129

Bunu doğrudan Interface Builder'da yapabilirsiniz. Özelliklerinizi seçin UITableViewve Özellikler Denetçisi'ni açın. Kaydırma Görünümü bölümünde Klavye alanını Sürüklerken Kapat'a ayarlayın .

resim açıklamasını buraya girin


Teşekkürler u hayatımı kurtardın!
Sabobin

41

Yukarıdaki cevaplara bir güncelleme eklemek için. Aşağıda Swift 1.2 benim için çalıştı

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag

veya

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.Interactive

2

Swift 5 ile

TableView'ı kaydırırken klavyeyi gizlemek ve düzgün bir şekilde düzenlemeyi durdurmak için, yine de iki tür cevabı birleştirmemiz gerekiyor :

  1. Klavye kapatma modunu IB'de ( Kyle açıkladığı gibi) veya ViewDidLoad()kodda ( Pei'nin açıkladığı gibi) ayarlayın:
tableView.keyboardDismissMode = .onDrag
  1. Geçerli metin alanını ilk yanıtlayıcı olarak istifaya zorlayın ( Vasily'nin cevabında olduğu gibi). Sadece UITableViewControllersınıfımıza aşağıdakileri eklememiz gerekiyor
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if !tableView.isDecelerating {
            view.endEditing(true)
        }
    }

1

Denetleyicinize tek bir kod satırı yazmadan çalışma çözümü:

Sorunuz, gizleme klavyesini yalnızca bir koşulla (kaydırmada) işlemektir. Ancak burada UIViewController, UITableView ve UIScrollView için cazibe gibi çalışan metin alanını ve klavyeyi birlikte işlemek için bir çözüm öneriyorum. İlginç olan, herhangi bir kod satırı yazmanıza gerek olmamasıdır.

İşte başlıyoruz : TPKeyboardAvoiding - Klavye ve kaydırma için harika bir çözüm


0

Görev

Swift 3'te UITableView kaydırırken klavyeyi programlı olarak gizle

ayrıntılar

xCode 8.2.1, hızlı 3

Çözüm

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

Tam Örnek

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>

Sonuç

resim açıklamasını buraya girin


0

İOS 7'den sonra, tableview özelliğini kolayca kullanabilirsiniz

Swift 3.0 ve üzeri

myTableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag

ObjectiveC

myTableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

Önceki sürümlerde, kaydırma görünümü temsilcisinin uygulanması işe yarayabilir.

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        view.endEditing(true)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.