1

ユーザーがカスタムセルの1つとしてtextFieldに値を入力できるテーブルビューがあります

Appleには、キーボードの垂直方向の寸法から離れた場所にビューを再配置することによってビューのコンテンツを調整する方法に関するドキュメントがいくつかありますが(ここ)、そのビューをUIScrollViewに配置することに依存しています。テーブルビューではこれを行うことはできません。

通常のナビゲーションコントローラーを使用して別の詳細ビューで入力が行われるようにアプリを再設計することもできますが、可能であれば、ユーザーが余分なタッチを実行する必要はありません(さらに別の画面に移動する必要はありません)。私は「私たちがいる場所で」証書を行うという考えが好きです

したがって、%20程度を含むいくつかの追加のテーブルビューセルを下部に配置するための回避策では、通常の使用法では、表示されているものにのみ焦点が当てられているため、奇妙なものを登録するべきではありません。データソース配列にスペースを格納してから降順で並べ替える必要がありますが、それで問題ありません。

問題は、これは良い習慣ですか?そしてさらに可能性としては、それは拒否するのに十分なAppleのHIGに反対するのだろうか?

4

3 に答える 3

2

UITableViewはUIScrollViewのサブクラスであるため、リンクした例と同じように、コンテンツとスクロールビューのインセットを調整できる必要があります。

于 2013-01-02T23:45:32.627 に答える
2

この問題を解決する方法は、サブクラス化することUITableViewです。これが私がしたことです:

// AOTableView.h file

typedef enum
{
    AOKeyboardStateUnknown = 0,
    AOKeyboardStateShowing,
    AOKeyboardStateHidden
} AOKeyboardState;

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

@interface AOTableView : UITableView
@property (nonatomic) BOOL observeKeyboardNotifications;
@property (nonatomic) AOKeyboardState keyboardState;
@end


// AOTableView.m file

#import "AOTableView.h"

@interface AOTableView(Private)
@property (nonatomic) CGRect frame0;
- (void)setup;
- (void)keyboardWillShow:(NSNotification *)notification;
- (void)keyboardWillHide:(NSNotification *)notification;
@end

@implementation AOTableView

#pragma mark - Object lifecycle

- (void)awakeFromNib
{       
    [self setup];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    if (self)
    {
        [self setup];
    }
    return self;
}

- (void)setup
{
    self.contentSize = self.frame.size;
    self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    _keyboardState = AOKeyboardStateUnknown;
    _frame0 = self.frame;
    _observeKeyboardNotifications = NO;
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

#pragma mark - Custom setters

- (void)setObserveKeyboardNotifications:(BOOL)observeKeyboardNotifications
{
    if (_observeKeyboardNotifications == observeKeyboardNotifications)
        return;

    _observeKeyboardNotifications = observeKeyboardNotifications;

    if (_observeKeyboardNotifications)
    {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    }
    else
    {
         [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
    }
}

#pragma mark - UIKeyboard Notifications

- (void)keyboardWillShow:(NSNotification *)notification
{
    if (self.keyboardState == AOKeyboardStateShowing)
        return;

    self.frame0 = self.frame;
    self.keyboardState = AOKeyboardStateShowing;

    NSDictionary* info = [notification userInfo];
    CGRect keyboardFrame = CGRectZero;
    [[info objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame];

    CGRect frame = self.frame0;    
    frame.size.height = CGRectGetMinY(keyboardFrame) - CGRectGetMinY(frame);
    self.frame = frame;

    [self scrollToRowAtIndexPath:self.indexPathForSelectedRow atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    [self deselectRowAtIndexPath:self.indexPathForSelectedRow animated:NO];
}

- (void)keyboardWillHide:(NSNotification *)notification
{
    if (self.keyboardState == AOKeyboardStateHidden)
        return;

    self.keyboardState = AOKeyboardStateHidden;
    self.frame = self.frame0;
}
@end

作成後(またはIBOutletからビューをロードした後)、このメソッドを呼び出して、キーボード通知のリッスンを開始するようにクラスに指示します。

[tableViewInstance setObserveKeyboardNotifications:YES];

ユーザーがセルをクリックするたびに、そのセルがセルになります...そのため、インスタンスによって自動的self.indexPathForSelectedRowにスクロールされます。AOTableView

ただし、これを機能させるには、セル内をオフuserInteractionにするUITextField必要があります(そうしないと、ユーザーがセルをクリックしているのかテキストフィールドをクリックしているのかについてデバイスが混乱する可能性があります)。代わりに、ユーザーがテキストフィールドのあるセルを選択すると、次のように、テキストフィールドにファーストレスポンダーになるように指示します。

[cell.textField becomeFirstResponder];

これがお役に立てば幸いです。

于 2013-01-02T23:46:44.450 に答える
1

余分なセルや特別なものは必要ありません。

テキストフィールドはテーブルビューセル内にあるため、次を使用できます。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    UITableViewCell *cell = (UITableViewCell *)textField.superview.superview;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    return YES;
}

これは、テキストフィールドがファーストレスポンダーになるたびにキーボードが適切にスクロールすることを意味します。これは、テーブルビューがスクロールビューのサブクラスであることを利用しています。

これは次のことを前提としていることに注意してください。

  • (テーブル)ビューコントローラは、テキストフィールドのデリゲートです。
  • テキストフィールドは、セル自体ではなく、セルのコンテンツビューのサブビューです。
    • テキストフィールドがセルのサブビューである場合、上記のメソッドの最初の行は1つのスーパービュー(つまり、textField.superview)のみを参照する必要があります。
于 2013-01-03T00:16:20.277 に答える