1. ホーム
  2. ios

[解決済み] UITableViewのスクロール時にキーボードを隠す

2022-06-02 20:15:14

質問

私のアプリでは、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では動きません。

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

この実装で困っていることがあります。

1) myUITableViewTouchesBeganがViewControllerで動作しない。

2) MyUITableView.mからのNSLog -。 NSLog(@"delegate myUITableViewTouchesBegan"); は、テーブルをタッチしたときだけ動作します。スクロールを開始したときにも動作するようにするにはどうしたらよいでしょうか。

scrollViewDidScrollをオーバーライドしてみましたが、MyUITableVIewがこの文字列に反応しない可能性があるとのことです。 [super scrollViewDidScroll:scrollView]と表示されます。

どのように解決するのですか?

なぜ、このためにUITableViewをサブクラス化する必要があるのか、よくわかりません。

プレーンなUITableViewを含むビューコントローラに、これを追加してみてください。

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