2011-07-22 84 views
3

我有一個UITableView,帶有一個Add cell ...行,並且想要在彈出的視圖上方彈出一個類似於「Messages」應用程序中的用戶的視圖鍵入新單元的名稱。將UITextField的inputAccessoryView設置爲其超級視圖

我意識到還有其他幾種獲取用戶數據的方法,以及幾種實現我嘗試實現的功能的方法。

例如,當應該創建新的播放列表時,iPod應用程序會顯示一個彈出窗口。

現在,我有一個隱藏的文本字段,當添加單元格...行被按下時,它被設置爲第一個響應者,我將包含輸入字段和確認按鈕的視圖指定爲此隱藏的inputAccessoryView領域。或者,我可以將此視圖添加爲表格的子視圖並使用鍵盤通知進行定位。

我只想知道是否有更乾淨的方法來完成我想要做的事情(例如將輸入文本字段的inputAccessoryView設置爲顯示爲textField的超級視圖)。我嘗試了幾種方法,但是當視圖關閉時,我似乎無法使用resignFirstResponder取消鍵盤。我可以使inputAccessoryView消失,但鍵盤仍然堅決打開,佔用必要的屏幕空間。此外,當筆尖的視圖是UITableView作爲文件的所有者而不是具有UIViewController作爲文件所有者的UIView時,我得到一個非常奇怪的錯誤:「設置表的第一響應者視圖,但我們不知道它的類型(細胞/頁眉/頁腳)」

由於提前, 朱利安Ceipek

回答

2

你在正確的軌道與setInputAccessoryView上的UITextView /的UITextField類這個方法可以讓你添加任何視圖你想要一個鍵盤的頂部。 您創建的視圖將使用委託方法來告訴主視圖控制器resignFirstResponder。

所以,讓你開始:

@protocol TextFieldAccessoryViewDelegate 
@required 
- (void)keyboardShouldDismiss; 

@end 

@interface TextFieldAccessoryView : UIView 
@property (nonatomic, retain) id<TextFieldAccessoryViewDelegate> delegate; 

- (id)initWithFrame:(CGRect)frame withDelegate (id<TextFieldAccessoryViewDelegate>)aDelegate; 

@end 

的實現可能看起來有點像(僅發佈,使視圖中的代碼):

#pragma mark - Private methods 
- (void)doneButtonTapped:(id)sender 
{ 
    [delegate keyboardShouldDismiss]; 
} 

- (void)setUpChildrenView 
{ 
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneButtonTapped:)]; 

    UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:@""]; 
    [navigationItem setRightBarButtonItem:doneButton]; 
    [navigationItem setHidesBackButton:YES]; 

    UINavigationBar *navigationBar = [[[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, self.width, 44.0f)] autorelease]; 
    [navigationBar pushNavigationItem:navigationItem animated:NO]; 

    [self addSubview:navigationBar]; 
} 

我使用了一個標準的導航欄尋找視圖,但你可以放入任何你喜歡的東西,包括按鈕,文本框,機器人獨角獸的圖像,作品

如果你沒有得到上述c頌揚你可能需要刷新委派並以編程方式創建視圖。

0
- (void)viewDidLoad 
    { 
    [self createAccessoryView]; 

    [textField setDelegate:self]; 
    [textField setKeyboardType:UIKeyboardTypeDefault]; 
    [textField setInputAccessoryView:fieldAccessoryView]; 


    } 


- (void)createAccessoryView 
    { 

     CGRect frame = CGRectMake(0.0, self.view.bounds.size.height, self.view.bounds.size.width, 44.0); 
     fieldAccessoryView = [[UIToolbar alloc] initWithFrame:frame]; 
     fieldAccessoryView.barStyle = UIBarStyleBlackOpaque; 
     fieldAccessoryView.tag = 200; 

     [fieldAccessoryView setBarStyle:UIBarStyleBlack]; 

     UIBarButtonItem *spaceButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
     UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)]; 

     UISegmentedControl* segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:NSLocalizedString(@"Previous", @""), NSLocalizedString(@"Next", @""), nil]]; 
     [segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged]; 
     segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; 
     [segmentedControl setMomentary:YES]; 
     UIBarButtonItem *segmentButton = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl]; 

     [fieldAccessoryView setItems:[NSArray arrayWithObjects:segmentButton, spaceButton, doneButton, nil] animated:NO]; 
     [segmentButton release]; 
     [spaceButton release]; 
     [doneButton release]; 
     [segmentedControl release]; 

    } 
相關問題