2012-01-21 24 views
9

Trong nhiệm vụ tìm ứng dụng iPhone đầu tiên của tôi, tôi đã đăng về cách xử lý chính xác phím quay lại trên bàn phím iOS. Bây giờ tôi cần tìm ra thanh công cụ phía trên bàn phím với các nút prev/next và done. Tôi đã làm việc với một ví dụ từ trang web sau: Input Accessory ViewThêm thanh công cụ UIToolbar để nhập giao diện phụ kiện vào một số trường văn bản

Ví dụ hoạt động, nhưng tôi muốn sử dụng UIToolbar và UIBarButtonItem thay vì chỉ là chế độ xem thông thường bằng các nút. Tôi đã thử các kết hợp khác nhau, chưa có tác phẩm nào. Đây là những gì tôi có cho đến nay.

Tiêu đề:

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController <UITextFieldDelegate> 
{ 
    UITextField* txtActiveField; 
    UIToolbar* keyboardToolbar; 
    UIBarButtonItem* btnDone; 
    UIBarButtonItem* btnNext; 
    UIBarButtonItem* btnPrev; 
} 

@property (nonatomic, strong) IBOutlet UITextField* firstNameTextField; 
@property (nonatomic, strong) IBOutlet UITextField* lastNameTextField; 
@property (nonatomic, strong) IBOutlet UITextField* cityTextField; 

@property (nonatomic, strong) UITextField* txtActiveField; 
@property (nonatomic, strong) UIToolbar* keyboardToolbar; 
@property (nonatomic, strong) UIBarButtonItem* btnDone; 
@property (nonatomic, strong) UIBarButtonItem* btnNext; 
@property (nonatomic, strong) UIBarButtonItem* btnPrev; 

-(void)createInputAccessoryView; 

@end 

Nguồn:

#import "ViewController.h" 

@implementation ViewController 

@synthesize firstNameTextField = _firstNameTextField; 
@synthesize lastNameTextField = _lastNameTextField; 
@synthesize cityTextField = _cityTextField; 

@synthesize txtActiveField = _txtActiveField; 
@synthesize keyboardToolbar = _keyboardToolbar; 
@synthesize btnDone = _btnDone; 
@synthesize btnNext = _btnNext; 
@synthesize btnPrev = _btnPrev; 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self createInputAccessoryView]; 
} 

- (void)viewDidUnload 
{ 
    [self setFirstNameTextField:nil]; 
    [self setLastNameTextField:nil]; 
    [self setCityTextField:nil]; 

    [self setTxtActiveField:nil]; 
    [self setKeyboardToolbar:nil]; 
    [self setBtnDone:nil]; 
    [self setBtnNext:nil]; 
    [self setBtnPrev:nil]; 

    [super viewDidUnload]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 

-(void)gotoPrevTextfield 
{ 
    if (self.txtActiveField == self.firstNameTextField) 
    { 
     return; 
    } 
    else if (self.txtActiveField == self.lastNameTextField) 
    { 
     [self.firstNameTextField becomeFirstResponder]; 
    } 
    else if (self.txtActiveField == self.cityTextField) 
    { 
     [self.lastNameTextField becomeFirstResponder]; 
    }   
} 

-(void)gotoNextTextfield 
{ 
    if (self.txtActiveField == self.firstNameTextField) 
    { 
     [self.lastNameTextField becomeFirstResponder]; 
    } 
    else if (self.txtActiveField == self.lastNameTextField) 
    { 
     [self.cityTextField becomeFirstResponder]; 
    } 
    else if (self.txtActiveField == self.cityTextField) 
    { 
     return; 
    }   
} 

-(void)doneTyping 
{ 
    [self.txtActiveField resignFirstResponder]; 
} 

-(void)createInputAccessoryView 
{ 
    self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)]; 
    self.keyboardToolbar.barStyle = UIBarStyleBlackTranslucent; 
    self.keyboardToolbar.tintColor = [UIColor darkGrayColor]; 

    btnPrev = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:@selector(gotoPrevTextfield:)]; 
    btnNext = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:@selector(gotoNextTextfield:)]; 
    btnDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneTyping:)]; 

    [self.keyboardToolbar addSubview:(UIView*)btnPrev]; 
    [self.keyboardToolbar addSubview:(UIView*)btnNext]; 
    [self.keyboardToolbar addSubview:(UIView*)btnDone]; 

    [self.firstNameTextField setInputAccessoryView:self.keyboardToolbar]; 
    [self.lastNameTextField setInputAccessoryView:self.keyboardToolbar]; 
    [self.cityTextField setInputAccessoryView:self.keyboardToolbar]; 
} 

-(void)textFieldDidBeginEditing:(UITextField*)textField 
{ 
    self.txtActiveField = textField; 
} 
@end 

Khi tôi khởi động ứng dụng tôi nhận được:

012-01-21 09:31:19.798 KeyboardToolbar[14772:f803] -[UIBarButtonItem superview]: unrecognized selector sent to instance 0x6b19350 
2012-01-21 09:31:19.799 KeyboardToolbar[14772:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIBarButtonItem superview]: unrecognized selector sent to instance 0x6b19350' 
*** First throw call stack: 
(0x13bc052 0x154dd0a 0x13bdced 0x1322f00 0x1322ce2 0x5042f 0x4a72b 0x3422 0x2a58 0xd964e 0x39a73 0x39ce2 0x39ea8 0x40d9a 0x11be6 0x128a6 0x21743 0x221f8 0x15aa9 0x12a6fa9 0x13901c5 0x12f5022 0x12f390a 0x12f2db4 0x12f2ccb 0x122a7 0x13a9b 0x2728 0x2685 0x1) 
terminate called throwing an exception 

giả định của tôi là tôi đã không được phân bổ một trong những yếu tố chính xác . Tôi cũng tự hỏi nếu tôi cần phải có các lĩnh vực trong lớp cho các nút hoặc nếu những người chỉ có thể được thêm vào thanh công cụ. Và tôi đặt một dòng trong tiêu đề để tôi sẽ không phải đặt tất cả các phương pháp của mình ở đầu tệp. Không biết cú pháp nào để chuyển tiếp khai báo phương thức giống như bạn có thể thực hiện trong C.

Cảm ơn bạn.

Cập nhật:

Vì vậy, tôi thực hiện một số thay đổi đối với createInputAccessoryView. Tôi đang sử dụng addItems ngay bây giờ để thêm các nút. Tôi đã thực hiện các biến nút cục bộ (nhưng có cùng một vấn đề khi chúng giống như trước). Tin tốt là các ứng dụng không sụp đổ nữa, tin xấu là thanh công cụ cho thấy, nhưng không có bất kỳ nút nào. Bạn không chắc chắn những gì khác tôi cần làm để có được các nút để thực sự hiển thị. Tất cả các ví dụ tôi đã thấy là tương tự.

-(void)createInputAccessoryView 
{ 
    self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)]; 
    self.keyboardToolbar.barStyle = UIBarStyleBlackTranslucent; 
    self.keyboardToolbar.tintColor = [UIColor darkGrayColor]; 

    UIBarButtonItem* previousButton = [[UIBarButtonItem alloc] initWithTitle:@"Previous" style:UIBarButtonItemStyleBordered target:self action:@selector(gotoPrevTextfield)]; 
    UIBarButtonItem* nextButton = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStyleBordered target:self action:@selector(gotoNextTextfield)]; 
    UIBarButtonItem* flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
    UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneTyping:)]; 

    [keyboardToolbar setItems:[NSArray arrayWithObjects: previousButton, nextButton, flexSpace, doneButton, nil] animated:NO]; 

    [self.firstNameTextField setInputAccessoryView:self.keyboardToolbar]; 
    [self.lastNameTextField setInputAccessoryView:self.keyboardToolbar]; 
    [self.cityTextField setInputAccessoryView:self.keyboardToolbar]; 
} 

Trả lời

8

UIBarButtonItem không phải là một lớp con UIView, vì vậy bạn không thể thêm nó như là một subview của UIToolbar. Thay vào đó, hãy sử dụng phương thức – setItems:animated: trên thanh công cụ của bạn để thêm các nút đó.

+0

Tôi đã cố gắng mã mà trước đó, nhưng chỉ trong trường hợp tôi đã làm hỏng điều gì đó, tôi đã thực hiện các thay đổi bạn đã đề xuất. Điều đó giải quyết được sự cố, nhưng không có nút nào hiển thị (thanh công cụ hiển thị ít nhất). Tôi cập nhật cách tôi thêm các nút, nhưng điều đó cũng không giúp được gì. Bất kỳ ý tưởng nào khác? Cảm ơn. –

+1

Bạn có chắc chắn không cần phải thêm 'self' trước' keyboardToolbar' trên dòng nơi bạn thiết lập các mục không? Nó có lẽ không quan trọng, nhưng nó có thể. Ngoài ra, hãy đảm bảo các nút không bị vô tình phát hành. Bạn đang sử dụng ARC? –

+0

Ok, đó là điều tôi không thực sự hiểu. Cảm ơn btw, tôi tự thêm vào. để thêm các mục gọi và bây giờ các nút hiển thị. Nếu bạn chỉ sử dụng biến mà không có bản thân, bạn đang truy cập cái quái gì? –

-2

Sự cố phải ở nơi bạn thêm chế độ xem phụ kiện này.

0

Tôi đã quản lý để sử dụng mã của bạn trong dự án hiện tại của tôi với việc bổ sung thêm thanh công cụ trên đầu trang UIDatePicker được khởi tạo bởi một trường văn bản bên trong UITableView. Tôi đang sử dụng các tế bào tĩnh.

Nó phù hợp với tôi.

Tôi có UITextFields như IBOutlets và chỉ sử dụng mã này để thiết lập InputAccessoryView

[textFieldName setInputAccessoryView:self.keyboardToolbar]; 
[textFieldEmail setInputAccessoryView:self.keyboardToolbar]; 
[textFieldPhone setInputAccessoryView:self.keyboardToolbar]; 
[textFieldDate setInputAccessoryView:self.keyboardToolbar]; 
[textFieldSize setInputAccessoryView:self.keyboardToolbar]; 

Vâng, các nút tiếp theo và trước làm việc như một nét duyên dáng (nhưng chỉ trên các con đường xuống bảng). Tôi vẫn phải di chuyển bảng theo cách thủ công lên trên cùng khi sao lưu. Vì một số lý do, UITableViewController chỉ xử lý kịch bản cuộn xuống, mà tôi thấy khá lạ, nhưng đây là đoạn mã của tôi cho trước đó.

- (void) gotoPrev { 
if (self.activeField == textFieldName) { // name --> nowhere 
    return; 
} 
else if (self.activeField == textFieldEmail) { // email --> name 
    [textFieldName becomeFirstResponder]; 
} 
else if (self.activeField == textFieldPhone) { // phone --> email 
    [textFieldEmail becomeFirstResponder]; 
    // Scroll jeegar 
    NSIndexPath * myIndexPath= [NSIndexPath indexPathForRow:0 inSection:0]; 
    [self.tableView scrollToRowAtIndexPath:myIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} 
else if (self.activeField == textFieldDate) { // date --> phone 
    [textFieldPhone becomeFirstResponder]; 
} 
else if (self.activeField == textFieldSize) { // people --> date 
    [textFieldDate becomeFirstResponder]; 
}  
} 
1

Không chắc chắn nếu quá muộn.Tôi đặt giải pháp của tôi về việc thêm UIToolbar vào UIKeyboard và các kiểu bàn phím thay đổi với nội dung UITextField và xử lý UIBarButtonItem bằng "Trước", "Tiếp theo" và "Xong" tại Github. Và nếu TextFields ở các phần khác nhau của tableview, nó sẽ trở nên phức tạp hơn.

+0

Liên kết Github bị hỏng – Besi

+0

Liên kết không bị hỏng. – mrd

0

Tôi nghĩ rằng các nút của bạn chỉ là không nhìn thấy được vì đoạn mã sau:

self.keyboardToolbar.barStyle = UIBarStyleBlackTranslucent; 
self.keyboardToolbar.tintColor = [UIColor darkGrayColor]; 

Hãy thử sử dụng

self.keyboardToolbar.barStyle = UIBarStyleBlack; 
self.keyboardToolbar.tintColor = [UIColor whiteColor]; 

thay

Các vấn đề liên quan