Ẩn bàn phím khi cuộn UITableView


134

Trong ứng dụng của tôi, tôi muốn ẩn bàn phím khi bắt đầu cuộn UITableView. Tôi tìm kiếm về điều này trên internet và hầu hết câu trả lời là phân lớp UITableView (http://stackoverflow.com/questions 43299810/ticking-a-uiscrollview-to- leather-the-keyboard).

Tôi đã tạo lớp con nhưng nó không hoạt động.

#import <UIKit/UIKit.h>

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

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

tập tin .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 {
...

Tôi sử dụng lớp học như thế này. Nhưng chức năng ủy nhiệm myUITableViewTouchesBegan không hoạt động trong ViewContoder

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

Tôi gặp một số rắc rối với việc triển khai này:
1) myUITableViewTouchesBegan không hoạt động trong ViewContoder
2) NSLog từ MyUITableView.m - NSLog (@ "ủy nhiệm myUITableViewTouchesBegan"); chỉ làm việc khi tôi chạm vào bàn. Làm thế nào nó cũng hoạt động khi tôi bắt đầu cuộn?
Tôi thử ghi đè scrollViewDidScroll nhưng comiler nói rằng MyUITableVIew có thể không phản hồi trên chuỗi này [super scrollViewDidScroll: scrollView];

Câu trả lời:


144

Không chắc chắn lý do tại sao bạn cần phân lớp UITableView cho việc này.

Trong trình điều khiển xem có chứa UITableView đơn giản, hãy thử thêm điều này:

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

417

Dưới đây là cách sạch nhất để đạt được điều này trong iOS 7.0 trở lên:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

Hoặc để loại bỏ tương tác khi chạm vào:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

Hoặc trong Swift:

tableView.keyboardDismissMode = .onDrag

Để loại bỏ tương tác:

tableView.keyboardDismissMode = .interactive

21
Thuộc tính này tất nhiên cũng có thể được đặt trong trình kiểm tra thuộc tính cho những người sử dụng ngòi và bảng phân cảnh.
JuJoDi

1
Anh bạn, tôi rất sợ cái này là một bản cập nhật, tôi vẫn đang sử dụng cách thức cũ với giao thức mà scrollview đã cuộn .... Cảm ơn người đàn ông của tôi!
Tomas Sykora

3
Đối với những người quên, bạn vẫn cần làm cho UITextfield từ chức trả lời đầu tiên.
đường chân trời75361

Tôi đã làm iOS dev được 3 năm và tôi không biết về điều này cho đến bây giờ ... không thật.
Jacob King

Làm thế nào để tôi bỏ lỡ những thứ này, rực rỡ!
người bẫy

129

Bạn có thể làm điều này ngay trong Interface Builder. Chọn của bạn UITableViewvà mở Thanh tra thuộc tính. Trong phần Chế độ xem cuộn, đặt trường Bàn phím thành Loại bỏ khi kéo .

nhập mô tả hình ảnh ở đây


Cảm ơn bạn vừa cứu mạng tôi!
Sabobin

41

Chỉ cần thêm một bản cập nhật cho các câu trả lời ở trên. Dưới đây làm việc cho tôi trong Swift 1.2

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag

hoặc là

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.Interactive

2

Với Swift 5

Để ẩn bàn phím khi cuộn TableView và dừng chỉnh sửa đúng cách, chúng ta vẫn cần kết hợp hai loại câu trả lời:

  1. Đặt chế độ loại bỏ bàn phím trong IB (như Kyle đã giải thích) hoặc bằng ViewDidLoad()mã (như Pei đã giải thích) chẳng hạn:
tableView.keyboardDismissMode = .onDrag
  1. Buộc trường văn bản hiện tại phải từ chức như người trả lời đầu tiên (như trong câu trả lời của Vasily ). Chúng tôi chỉ cần thêm những điều sau đây vào UITableViewControllerlớp học của chúng tôi
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if !tableView.isDecelerating {
            view.endEditing(true)
        }
    }

1

Giải pháp làm việc mà không cần viết một dòng mã trong Bộ điều khiển của bạn:

Vì câu hỏi của bạn là chỉ xử lý bàn phím ẩn với một điều kiện duy nhất (khi cuộn). Nhưng ở đây tôi đề xuất một giải pháp để xử lý trường văn bản và bàn phím cùng hoạt động như sự quyến rũ cho UIViewControll, UITableView và UIScrollView. Một sự thật thú vị là bạn không cần phải viết bất kỳ dòng mã nào.

Ở đây bạn đi: TPPalAvoiding - Một giải pháp tuyệt vời để xử lý bàn phím và cuộn


0

Bài tập

Ẩn bàn phím theo chương trình khi cuộn UITableView trong Swift 3

Chi tiết

xCode 8.2.1, nhanh chóng 3

Giải pháp

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

Mẫu đầy đủ

ViewContoder

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

Câu chuyện

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

Kết quả

nhập mô tả hình ảnh ở đây


0

Sau iOS 7, bạn có thể đơn giản sử dụng thuộc tính xem bảng

Swift 3.0+

myTableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag

Mục tiêu

myTableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

Đối với các phiên bản trước đó, việc triển khai đại biểu xem cuộn có thể hoạt động.

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        view.endEditing(true)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.