iOS核心笔记——UIPickerView

1、UIPickerView简介

  • UIPickerView继承自UIView,且遵守了协议;UIPickerView的高度(height = 162)不能改变, 但UIPickerView中的行高可以改变。
  • UIPickerView两个必须实现的数据源方法:
  • UIPickerView常见属性:
  • UIPickerView代理方法:
#pragma mark - <UIPickerViewDelegate>
/**
 *  pickerView每一列宽度
 */
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{
    return 100;
}

/**
 *  pickerView每一行高度
 */
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{
    return 60;
}

/**
 *  pickerView每行显示内容
 */
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    return @"贺华峰";
}

/**
 *  pickerView显示字符串时,字符串富文本属性(可设置字符串字体大小、字体颜色...),返回nil时不影响显示文字
 */
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component{
    return nil;
}

/**
 *  pickerView每行显示视图, 当与pickerView:titleForRow:forComponent:同时实现时, 优先调用
 */
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view{
    return nil;
}

/**
 *  pickerView选中某行或某列时调用, 只有用户拖拽才会调用
 */
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    NSLog(@"%s", __func__);
}
  • UIPickerView显示?问题:
    • 原因: 只设置了数据源, 没有设置代理实现返回pickerView要显示的内容; 所以, pickerView显示默认的?
  • 点击随机点餐按钮实现随机点餐:
    /**
    *  随机点餐
    */
    - (IBAction)random {
        for (int i = 0; i < self.foods.count; i++) {
            // 1. 随机数
            int random = arc4random_uniform((u_int32_t)[self.foods[i] count]);
            // 2. 选中pickerView对应的列、行
            [self.pickView selectRow:random inComponent:i animated:YES];
    
            // 3. 将随机选中的数据设置到对应的Label上, 此处的row切记不能再重新使用随机数
            //[self pickerView:self.pickView didSelectRow:arc4random_uniform((u_int32_t)[self.foods[i] count]) inComponent:i];
            [self pickerView:self.pickView didSelectRow:random inComponent:i];
        }
    }
    
    • 在实现随机点餐的时候两大注意事项:
      • 使用随机数函数时要注意每调用一次都会生成新的随机数, 如果要多次使用同一个随机数; 需要定义一个变量保存要多次使用的随机数。
      • 调用pickerView的selectRow:inComponent:animated:时, pickerView的代理方法pickerView:didSelectRow:inComponent:方法不会调用, 需要我们手动调用; 但是, 当用户拖拽pickerView时代理方法pickerView:didSelectRow:inComponent:方法会自动调用。

2、UIPickerView实现国旗选择(MVC模式)

  • Model(模型): HFFlag
    • 继承自NSObject类,设置属性保存数据;
  • View(视图): HFFlagView
    • 使用xib封装国旗视图,在数据模型的set方法中设置控件数据;
  • Controller(控制器): Controller
    • 懒加载读取plist文件,获取数据;
    • 实现数据源方法;
    • 实现代理方法,返回UIPickerView自定义显示视图。

3、UIDatePicker简介

  • UIDatePicker继承自UIControl:
  • 使用UIDatePicker的三大步骤:
    • <1> 创建UIDatePicker:

      // 1. 创建UIDatePicker: 具有默认尺寸
      UIDatePicker *datePicker = [[UIDatePicker alloc] init];
      
    • <2> 设置UIDatePicker显示模式:
      // 2. 设置UIDatePicker显示模式
      datePicker.datePickerMode = UIDatePickerModeDate;
      
      • UIDatePicker显示模式:
    • <3> 设置UIDatePicker显示时区:
      // 3. 设置UIDatePicker时区
      datePicker.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];
      //    datePicker.locale = [NSLocale currentLocale]; // 当系统语言为中文时与上面代码等价
      //    datePicker.locale = [NSLocale systemLocale];
      
  • UIDatePicker监听时间变化:
    • 因为UIDatePicker继承自UIControl, 所以采用addTarget:action:forControlEvents:方法监听UIDatePicker上时间变化, 监听事件为UIControlEventValueChanged:

      [datePicker addTarget:self action:@selector(dateChange:) forControlEvents:UIControlEventValueChanged];
      

4、UITextField代理方法

  • 要实现UITextField代理方法, 必须先遵守协议; 成为UITextField的代理。
  #pragma mark - <UITextFieldDelegate>
  /**
    *  @return YES : 文本框允许编辑
    *  @return  NO : 文本框不允许编辑
    */
  - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
      return NO;
  }

  /**
    *  文本框成为第一响应者
    */
  - (void)textFieldDidBeginEditing:(UITextField *)textField{
      NSLog(@"%@", textField);
  }

  /**
    *  是否允许当前文本框结束编辑
    *
    *  @return YES : 文本框允许结束编辑, 且当前正在编辑的文本框辞去第一响应者身份
    *  @return  NO : 当前文本框不允许结束编辑直至结束
    */
  - (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
      return NO;
  }

  /**
    *  文本框已经结束编辑
    */
  - (void)textFieldDidEndEditing:(UITextField *)textField{
      NSLog(@"%s", __func__);
  }

  /**
    *  文本款是否能够显示输入
    *
    *  @param range     当前文本框光标所在位置, 与输入之后光标所在位置
    *  @param string    替换文本框中range范围内容
    *
    *  @return YES : 输入文本框的内容能替换range范围,光标移动
    *  @return  NO : 文本框不能替换,光标不移动
    */
  - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
      return NO;
  }

  /**
    *  只要点击文本框清除按钮, 调用此方法
    *
    *  @return YES : 点击清空按钮清空文本框
    *  @return  NO : 点击清空按钮忽略, 文本框内容不清空
    */
  - (BOOL)textFieldShouldClear:(UITextField *)textField{

      return YES;
  }

  /**
    *  只要点击键盘return键调用此方法
    */
  - (BOOL)textFieldShouldReturn:(UITextField *)textField{

      return NO;
  }
  • 以下属性是设置文本框下一次编辑开始时自动清空文本框内容,下一次编辑开始时会自动调用textFieldShouldClear:方法以清空文本框:
  • 自定义键盘, 设置文本框的inputVeiw属性;自定义文本框输入视图。

5、将时间以格式字符串形式显示步骤:

  • <1> 获取要显示的时间;
  • <2> 创建时间格式管理对象;
  • <3> 设置时间格式对象的时间格式字符串;
  • <4> 时间格式对象调用其stringFromDate:方法, 传入要显示的时间; 返回格式时间字符串。
  • 示例程序:
    // 1. 创建datePicker
    UIDatePicker *datePicker = [[UIDatePicker alloc] init];
    datePicker.datePickerMode = UIDatePickerModeDate;
    datePicker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];
    
    // 2. 获取datePicker时间
    NSDate *date = datePicker.date;
    // 3. 时间格式管理对象
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // 4. 设置时间格式字符串
    formatter.dateFormat = @"yyyy-MM-dd";
    // 5. 获取格式时间字符串
    NSString *dateStr = [formatter stringFromDate:date];
    

细小知识点:

  • <1> storyboard中直接拖线设置控制器为控件的代理与数据源, 在控制器可以不用写明相应的协议; 因为连线时已经自动设置控制器遵守相应的协议, 为保持代码可读性通常依旧会在控制器代码中声明遵守相应的协议。
  • <2> Xcode中能直接使用jpg、png、gif格式的图片。
  • <3> id与instancetype区别:
    • instancetype: 作为方法的返回值类型时能自动识别当前接收类型与方法实质返回类型是否一致,不能声明变量;
    • id: 作为方法返回值类型时方法返回对象的接收类型可以是任意类型,且可以声明变量;id类型的对象可以调用任何方法,编译时不会报错;运行时如果调用了没有实现的方法程序会崩溃;id类型变量不能使用点语法。
  • <4> 字符串调用NSString类的capitalizedString方法,返回字符串首字母大写之后的字符串。
  • <5> 所有继承自UIControl类的控件都可以采用addTarget:action:forControlEvents:方法监听控件。

实用小技巧:

  • <1> NSLog方法使用%s重打印 __func__: 输出调用当前方法所在的类;
  • <2> Debug中调试显示当前界面所有layer(图层):
  • <3> Xcode快捷键:
    • 1、 command + option + 回车 : 分屏;
    • 2、 command + 回车 : 退出分屏。
    • 3、command + option + [ : 代码上调
    • 4、command + option + ] : 代码下调
    • 5、command + [ : 代码左移
    • 6、command + ] : 代码右移
  • <4> 当无法确认控件监听触发事件类型时, 可以将storyboard中控件连线到代码中以方便查看事件类型。
时间: 2024-10-12 21:14:01

iOS核心笔记——UIPickerView的相关文章

iOS核心笔记——UICollectionView-布局对象

iOS核心笔记--UICollectionView-布局对象 1.UICollectionView布局对象: 1-1.UICollectionViewLayout: ?了解:1.UICollectionViewLayout没有itemSize属性,而collectionView的cell的大小不能为0或者小于0:所以,通常collectionView使用其子类UICollectionViewFlowLayout布局cell. ?了解:2.UICollectionViewLayout中声明了布局可

iOS核心笔记——UICollectionView-辅助视图

iOS核心笔记--UICollectionView-辅助视图 1.UICollectionView辅助视图: ?了解:UICollectionView中的头部视图.尾部视图都是使用注册机制 + 重用机制,提高程序的执行效率,其头尾部视图类型均为:UICollectionReusableView.注册辅助视图时使用字符串区分注册的视图为头部还是尾部视图,其区分字符串为:UICollectionElementKindSectionHeader(头部视图).UICollectionElementKin

iOS核心笔记—MapKit框架-导航

1.导航简介: ?了解:导航,简单来说,就是根据用户指定的位置,进行路线规划:然后根据用户在行走过程中,实时的给出指引提示. 1-1.iOS导航实现方案: 方案 详细说明 方案一 将需要导航的位置传递给系统的地图APP进行导航 方案二 发送网络请求到Apple服务器/公司服务器获取导航数据,然后,手动绘制导航路线 方案三 利用第三方SDK实现导航功能(百度地图) ?说明:通常如果需要手动绘制导航路线,都是向Apple服务器发送请求.获取导航信息:此处,只对方案一.方案二做详细介绍,方案三将单独说

iOS核心笔记——多线程-GCD

1.GCD简介: ?了解:GCD全称为"Grand Central Dispatch",纯C语言,GCD提供了非常多功能强大的函数:GCD中所有的函数都包含于Libdispatch库中. 1-1.使用GCD的优势: ?了解:1.GCD是苹果公司为多核的并行运算提出的解决方案: ?了解:2.GCD会自动利用更多的CPU内核(例如:双核.四核): ?了解:3.GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程). 1-2.GCD两大核心概念: 名称 作用: 任务 执行什么操作 队

iOS学习笔记—— UIPickerView 控件的简单使用

UIPickerView 是iOS常用的控件之一,它通过轮转界面提供一系列多值选项,它向用户展示信息,也能收集用户输入.下面是一个普通的UIPickerView控件. 使用UIPickerView控件需要遵守两种协议,一种是UIPickerViewDelegate,另一种是UIPickerViewDataSource. UIPickerViewDelegate协议的方法有: 1.  -(NSString *) pickerView: (UIPickerView * )pickerView tit

iOS核心笔记——iOS通知机制

1.iOS通知机制: 1-1.iOS通知发布者.通知中心.监听器之间的关系: 如下图所示: 2.通知(NSNotification)简介: 3.通知中心(NSNotificationCenter) 3-1.每个应用程序只有一个通知中心对象(单例对象): 4.发布通知: 4-1.对象在自己需要的某个时候使用通知类(NSNotification)创建通知对象后让通知中心帮忙发布通知: 1.可以在对象A需要使用通知的某个位置,直接让通知中心帮忙发送的时候将通知中的一系列信息通过通知中心提供的方法创建通

iOS核心笔记——网络编程-网络安全

1.数据安全: 1.01 攻城利器:Charles(公司中一般都使用该工具来抓包,并做网络测试)2.注意:Charles在使用中的乱码问题,可以显示包内容,然后打开info.plist文件,找到java目录下面的VMOptions,在后面添加一项:-Dfile.encoding=UTF-83.02 数据安全的原则4. 1)在网络上"不允许"传输用户隐私数据的"明文"5. 2.)在本地"不允许"保存用户隐私数据的"明文"6.03

iOS核心笔记——多线程-基本知识

1.基本概念: 1-1.进程: 定义:进程是指系统中正在运行的应用程序. 了解:每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间里. 1-2.线程: 一个进程要想执行任务,必须要有一条线程(即:每一个进程至少拥有一条线程,这条线程便是主线程). 一个进程中的所有任务都是在线程中执行. 线程是进程的基本执行单元. 1-3.线程的串行: 线程中所有的任务都是串行执行的,即:如果要在1个线程中执行多个任务时,多个任务只能按顺序执行:且同一时刻,1个线程只能执行1个任务. 1-4.进程与线

iOS核心笔记——RunLoop-基础

1.RunLoop介绍: ?了解:RunLoop从字面意思看就是运行循环.跑圈,通常情况下,一个线程一次只能执行一个任务:任务执行完毕后线程就会进入消亡状态随之退出.有时候我们希望线程执行完任务之后还能随时处理事件且不退出,所以,iOS提供了RunLoop. 1-1.什么是RunLoop? ?重要:RunLoop实际上就是一个对象,RunLoop对象管理其需要处理的事件和消息:RunLoop能够让线程在没有处理消息时进入休眠状态以避免占用资源.在监听到事件源发送的消息时立刻唤醒线程.RunLoo