zoukankan      html  css  js  c++  java
  • inputAccessoryView,inputView


    我们在使用UITextView和UITextField的时候,可以通过它们的inputAccessoryView属性给输入时呼出的键盘加一个附属视图,通常是UIToolBar,用于回收键盘。

    但是当我们要操作的视图不是UITextView或UITextField的时候,inputAccessoryView就变成了readonly的。

    这时我们如果还想再加inputAccessoryView,按API中的说法,就需要新建一个该视图的子类,并重新声明inputAccessoryView属性为readwrite的。比如我们要实现点击一个tableView的一行时,呼出一个UIPickerView,并且附加一个用于回收PickerView的toolbar。因此我们自建一个UITableViewCell类,并声明inputAccessoryView和inputView为readwrite的,并且重写它们的get方法,这样在某个tableviewcell变成第一响应者时,它就会自动呼出inputView和inputAccessoryView;

    复制代码
    1 @interface MyTableViewCell : UITableViewCell<UIPickerViewDelegate,UIPickerViewDataSource>
    2 {
    3     UIToolbar *_inputAccessoryView;
    4     UIPickerView *_inputView;
    5 }
    6 @property(strong,nonatomic,readwrite) UIToolbar *inputAccessoryView;
    7 @property(strong,nonatomic,readwrite) UIPickerView *inputView;
    8 @end
    复制代码

    .m中的get方法:

    复制代码
     1 -(UIToolbar *)inputAccessoryView
     2 {
     3     if(!_inputAccessoryView)
     4     {
     5         UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];
     6 //        UIBarButtonItem *right = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonItem target:self action:@selector(dodo)];
     7         UIBarButtonItem *right = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dodo)];
     8         toolBar.items = [NSArray arrayWithObject:right];
     9         return toolBar;
    10     }
    11     return _inputAccessoryView;
    12 }
    13 -(UIPickerView *)inputView
    14 {
    15     if(!_inputView)
    16     {
    17       UIPickerView *  pickView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, 200, 320, 200)];
    18         pickView.delegate =self;
    19         pickView.dataSource = self;
    20         pickView.showsSelectionIndicator = YES;
    21         return pickView;
    22     }
    23     return _inputView;
    24 }
    25 -(void)dodo
    26 {
    27     [self resignFirstResponder];
    28 }
    29 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
    30 {
    31     return 1;
    32 }
    33 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
    34 {
    35     return [NSString stringWithFormat:@"%d",row];
    36 }
    37 // returns the # of rows in each component..
    38 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
    39 {
    40     return 5;
    41 }
    复制代码

    但是这时运行后还是没有反应,最后在一个网页中查到这样的话:

    What is the best, we aren't limited to use this feature on UITextFields only. Because of fact that UIView inherits from UIResponder, we can attach this behaviour to all views, for example to a button or a table cell. To do that we have to override canBecomeFirstRespondermethod in our subclass. For example, the UIButton subclass implementation can look like this:

        implementation CustomButton { } //it is UIButton subclass
        
        @synthesize inputView, inputAccessoryView;
        
        - (BOOL) canBecomeFirstResponder {
            return YES;
        }
        
        - (void)dealloc {
            [inputView release];
            [inputAccessoryView release];
            [super dealloc];
        }
        
        @end
    因此我在.m中重写canBecomeFirstResponder方法
    -(BOOL)canBecomeFirstResponder
    {
        return YES;
    }

    但是这时运行是还是没有反应,最后我只好在代码中当cell被选中时,手动把它变成第一响应者。(难道cell被选中时不是第一响应者?)

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        [cell becomeFirstResponder];
    }

    运行结果:

  • 相关阅读:
    mui 点击输入框软键盘弹起解决
    Vue中form表单常用rules校验规则
    ios new Date('yyyy-MM-dd HH-mm-ss').getTime() 方法获取不到时间戳
    uni-app运行到手机报错 Component constructors should be called while initialization. A constructor call has been ignored.
    vue-element-admin后台 点击侧边栏 刷新当前路由
    vue 防抖和节流
    vue data数据变化 页面数据不更新问题
    uni-app中页面部分内容使用索引列表(uni-indexed-list),动态数据
    css 文本单行显示溢出时出现省略号 多行显示溢出时出现省略号 首行缩进
    css实现两个div并排等高(一个div高度随另一个高度变化而变化)
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879443.html
Copyright © 2011-2022 走看看