1

次のコードを使用して、UITextFieldデリゲートを使用して次のフィールドに移動します。また、前、次、および[OK]ボタンを使用してツールバーをキーボードに追加します。コードは正常に機能しています。

ご覧のとおり、キーボードのリターンボタンのロジックは、UITextFieldタグを使用した非常に一般的なものであり、コードの一部を使用するので、これは良いことです。次に、前のボタンと次のボタンのロジックを作成する必要がありますが、迷子になっています。何か案は?

更新(完全なコード、いくつかの変更を加えたもの、チャットで私と一緒に時間を費やして機能させてくれた@ 8viusに感謝します):

//
// SigninViewController.m
//

#import "SigninViewController.h"

@implementation SigninViewController

@synthesize firstResponder = _firstResponder;
@synthesize toolbar;
@synthesize email;
@synthesize password;

- (void)move:(UIBarButtonItem*)sender {

    NSInteger tag = self.firstResponder.tag;

    if ([sender.title isEqualToString:@"Anterior"]) {
        tag -= 1;
    } else if ([sender.title isEqualToString:@"Próximo"]) {
        tag += 1;
    }

    UITextField *nextTextField = (UITextField*)[self.view viewWithTag:tag];

    if (nextTextField && tag > 0) {
        [nextTextField becomeFirstResponder];
    } else {
        [self.firstResponder resignFirstResponder];
        self.firstResponder = nil;
    }

}

- (void)ok:(id)sender {
    [self.view endEditing:YES];
    self.firstResponder = nil;
}

- (void)textFieldDidBeginEditing:(UITextField*)textField {
    self.firstResponder = textField;
}

- (BOOL)textFieldShouldReturn:(UITextField*)textField {

    NSInteger tag = textField.tag + 1;

    UITextField *nextTextField = (UITextField*)[self.view viewWithTag:tag];

    if (nextTextField) {
        [nextTextField becomeFirstResponder];
    } else {
        [textField resignFirstResponder];
        self.firstResponder = nil;
    }

    return NO;

}

- (void)viewDidLoad {

    [super viewDidLoad];

    self.email.delegate = self;
    self.password.delegate = self;

    if (self.toolbar == nil)
    {
        self.toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];

        UIBarButtonItem* previous = [[UIBarButtonItem alloc] initWithTitle:@"Anterior" style:UIBarButtonItemStyleBordered target:self action:@selector(move:)];
        UIBarButtonItem* next = [[UIBarButtonItem alloc] initWithTitle:@"Próximo" style:UIBarButtonItemStyleBordered target:self action:@selector(move:)];
        UIBarButtonItem* space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:(UIBarButtonSystemItemFlexibleSpace) target:nil action:nil];
        UIBarButtonItem* ok = [[UIBarButtonItem alloc] initWithTitle:@"Ok" style:UIBarButtonItemStyleBordered target:self action:@selector(ok:)];

        [self.toolbar setItems:[[NSArray alloc] initWithObjects:previous, next, space, ok, nil]];

        [self.toolbar setTranslucent:YES];
        [self.toolbar setTintColor:[UIColor blackColor]];
    }

    for (UIView* view in self.view.subviews) {
        if ([view isKindOfClass:[UITextField class]]) {
            [(UITextField*)view setInputAccessoryView:toolbar];
        }
    }

}

- (void)viewDidUnload {
    self.email = nil;
    self.password = nil;
    [super viewDidUnload];
}

@end
4

1 に答える 1

2

ビューをロードするときに、必要なtag順序に応じてテキストフィールドにプロパティを設定し、フィールドのタグ要素をトラバースするだけで済みます。

- (void)toggleTextfield:(UIBarButtonItem *)sender {
  NSInteger nextTag = self.firstResponder.tag;
  if ([sender.title isEqualToString:@"Previous"] && nextTag > 1) {
    nextTag -= 1
  } else if ([sender.title isEqualToString:@"Next"]) {
    nextTag += 1;
  }

  UITextField *nextTextField = (UITextField *)[self.view viewWithTag:nextTag];
  if (nextTextField) {
    [nextTextField becomeFirstResponder];
  }
}

そして、誰が最初の応答者であるかを追跡します。

-(void)textFieldDidBeginEditing:(UITextField *)textField {
  self.firstResponder = textField;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
  [textField resignFirstResponder];
  self.firstResponder = nil;
  return YES;
}

また、ビューをロードするときに、ボタンをトグルアクションにバインドします。

  UIBarButtonItem *previousButton = [[UIBarButtonItem alloc] initWithTitle:@"Previous" 
                                                                     style:UIBarButtonItemStyleBordered 
                                                                    target:self
                                                                    action:@selector(toggleTextfield:)];
  UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithTitle:@"Next" 
                                                                     style:UIBarButtonItemStyleBordered 
                                                                    target:self
                                                                    action:@selector(toggleTextfield:)];

たとえば、私の場合、テーブルビュー内にテキストフィールドを設定したので、cellForRowAtIndexPathメソッドではtagプロパティをのに設定しましrowindexPath

編集:firstResponderそれが機能するためには、プロパティを設定する必要があります。

.hファイル内:

@property UIView *firstResponder

.mファイル内:

@synthesize firstResponder = _firstResponder;
于 2012-10-11T03:45:38.313 に答える