【问题标题】:Setting the inputAccessoryView of a UITextField to its superview将 UITextField 的 inputAccessoryView 设置为其父视图
【发布时间】:2011-07-22 14:01:05
【问题描述】:

我有一个带有添加单元格...行的 UITableView,并且希望弹出一个键盘,上面有一个视图,就像在“消息”应用程序中一样,用户可以在其中键入新单元格的名称。

我意识到还有其他几种获取用户数据的方法,以及实现我想要实现的功能的几种方法。

例如,当需要创建新的播放列表时,iPod 应用程序会显示一个弹出窗口。

现在,我有一个隐藏文本字段,当按下 Add cell... 行时,它设置为第一响应者,我将包含输入字段和确认按钮的视图分配为该隐藏字段的 inputAccessoryView .或者,我可以将此视图添加为表格的子视图并使用键盘通知定位它。

我只想知道是否有更简洁的方法来完成我正在尝试做的事情(例如将要显示的输入 textField 的 inputAccessoryView 设置为 textField 的超级视图)。我尝试了几种方法,但是当视图应该关闭时,我似乎无法使用 resignFirstResponder 关闭键盘。我可以让 inputAccessoryView 消失,但键盘仍然保持打开状态,占用必要的屏幕空间。此外,当 nib 的视图是 UITableView 与 UITableViewController 作为文件的所有者而不是 UIView 与 UIViewController 作为文件的所有者时,我得到一个非常奇怪的错误:“设置表的第一响应者视图,但我们不知道它的类型(单元格/页眉/页脚)”

提前致谢, 朱利安·塞佩克

【问题讨论】:

    标签: iphone objective-c uitableview first-responder


    【解决方案1】:

    您在 UITextView/UITextField 类的setInputAccessoryView 上走在正确的轨道上。此方法允许您将所需的任何视图添加到键盘顶部。 然后,您创建的视图将使用委托方法告诉主视图控制器 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];
    }
    

    我使用了标准的 NavigationBar 外观视图,但您可以放入任何您喜欢的内容,包括按钮、文本字段、机器人独角兽的图像、作品

    如果您没有了解上述代码中的所有内容,您可能需要复习委派并以编程方式创建视图。

    【讨论】:

      【解决方案2】:
        - (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];
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-25
        • 1970-01-01
        • 2013-12-01
        相关资源
        最近更新 更多