iOS多界面设计杂谈

判断程序首次启动

  • 利用NSUserDefaults,还可以判断程序的首次启动,方法是在AppDelegate.m文件中找到:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  • 该方法是UIApplication的协议方法,定义在AppDelegate类中,在程序每次启动之后被调用。在该方法中定义NSUserDefaults单例,可用任意键值判断是否为首次启动,因为在首次启动时还未建立任何键值,代码如下:
NSUserDefaults *launchSettings=[NSUserDefaults standardUserDefaults];
    if([launchSettings boolForKey:(@"hasLaunched")]==NO) {
        [launchSettings setBool:(YES) forKey:(@"hasLaunched")];
        [launchSettings setBool:(NO) forKey:(@"nightShiftOpen")];
    }
  • 其中if语句的条件如果成立就代表是首次启动,可加入欢迎页和新手提示等内容。

深入理解UITabBarController各页面的生命周期

  • UITabBarController是最常用的布局方式,要注意在启动时只有第一个页面会被加载,其他页面不会被加载。同时再次切换到每个页面的时候对应UIViewController的viewDidLoad方法不会被调用,不能把需要实时刷新的语句放入其中。不过可以利用方法:
- (void)viewWillAppear:(BOOL)animated

该方法是页面即将出现的时候被调用,可放入实时刷新的语句,例如下面的例子是简易的夜间模式的实现:

- (void)viewWillAppear:(BOOL)animated {
    BOOL isOpenNightShift=[_userSettings boolForKey:(@"nightShiftOpen")];
    if(isOpenNightShift==YES) {
        self.tableView.backgroundColor=[UIColor blackColor];
        self.navigationController.navigationBar.backgroundColor=[UIColor blackColor];
    }
    else {
        self.tableView.backgroundColor=[UIColor whiteColor];
        self.navigationController.navigationBar.backgroundColor=[UIColor whiteColor];
    }
}

视图控件监听方法的两种绑定方式

  • 关于视图控件监听方法的绑定,在包含StoryBoard或者xib文件的程序中,可以通过纯拖拽来实现,无需编写代码:只需要选择控件并按住control按钮进行拖拽,即可添加IBAction监听器方法。
  • 但是在UITableView的使用中,UITableViewCell是要求做到重用(reusable)的,包含在Cell中的控件在StoryBoard中没有对应的控件(例如Cell的accessoryView中的控件)。这时应该采用手动绑定的方式,先定义控件变量,例如在某UIViewController的@Interface中有如下定义:
@property (strong,nonatomic) UISwitch *nightShiftOpen;
  • 然后在viewDidLoad方法中,为该控件申请控件并添加监听器
if(_nightShiftOpen==nil) {
       _nightShiftOpen=[[UISwitch alloc]init];
    }
    [_nightShiftOpen addTarget:(self) action:(@selector(nightShiftOpenValueChanged:)) forControlEvents:(UIControlEventValueChanged)];
  • 其中nightShiftOpenValueChanged:是绑定的方法的名称,而UIControlEventValueChanged是事件的类型,此处类型为控件值的改变。 然后在对应的UIViewController中实现监听器方法,此处实现的是夜间模式开关的监听:
- (void)nightShiftOpenValueChanged:(id)sender {
    if([_nightShiftOpen isOn]==YES) {
        [_userSettings setBool:(YES) forKey:(@"nightShiftOpen")];
        self.tableView.backgroundColor=[UIColor blackColor];
        self.navigationController.navigationBar.backgroundColor=[UIColor blackColor];
    }
    else {
        [_userSettings setBool:(NO) forKey:(@"nightShiftOpen")];
        self.tableView.backgroundColor=[UIColor whiteColor];
        self.navigationController.navigationBar.backgroundColor=[UIColor whiteColor];
    }
    [_userSettings synchronize];
}
  • 这样在该UISwitch控件值改变时,会自动调用上面的方法。