一、 查看Sqlite内容
如果项目中用到sqlite,经常在开发过程中会去查看数据的变化。
找到Sqlite文件存储位置。
~/Library/ApplicationSupport/Simulator/6.1/Applications
其中6.1为自己设置的模拟器版本,如果模拟器为5.0的话就去5.0目录。
但是该位置下可能有很多文件夹,而且是以十六进制字符命名的,这种情况下有个简单的方式找到目标,通过查看文件修改时间,如下:
进入目标目录后,就可以根据自己代码中指定的相对目录去找到sqlite文件了。
比如代码中指定目录为
则实际目录就为:
通过sqlite3命令就可以操作。如下:
二、 清除项目缓存
一般情况下在工程中通过cmd+shift+k快捷键清除。
如果不行的话可以直接去删除缓存文件。
~/Library/Developer/Xcode目录下的DerivedData和Snapshots两个目录中的所有文件都删除。
三、 发送post数据
忽略缓存
//初始化http请求,忽略缓存
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:10];
content-type设置
NSString *contentType = [NSString stringWithFormat:@"application/x-www-form-urlencoded"];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];
设置为其他类型会发送失败,比如text/html,text/xml,不知为何。
四、 自定义视图做导航栏按钮
如果要将导航栏左右两侧的按钮做得精致,用控件基本的属性设置可能很难满足,好在UIBarButtonItem提供了接口用自定义的view来初始化,示例如下:
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *backImg = [UIImage imageNamed:@"back.png"] ;
UIImage *backImg2 = [UIImage imageNamed:@"back2.png"];
[backButton setImage:backImg forState:UIControlStateNormal];
[backButton setImage:backImg2 forState:UIControlStateHighlighted];
[backButton setFrame:CGRectMake(0,0,backImg.size.width,backImg.size.height)];
[backButton addTarget:self action:@selector(btnBackClicked) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *backBar = [[UIBarButtonItem alloc] initWithCustomView:backButton];
[self.navigationItem setLeftBarButtonItem:backBar];
以上展示了用一个UIButton作为UIBarButtonItem的视图,当然除了UIButton我们还可以尝试用其他View来实现自己想要的效果。
五、 自定义TabBar
折腾了一天UITabBar,它的集成度确实很高,不需要做什么工作就能实现功能,但是很让人头疼的是它完全不能满足我的需求,比如每个TabBarItem的图片区域只是限定在上半部分,下面的title不能控制字体大小,烦人的高光效果。还有,对每个TabBarItem的自定义是放在对应的ViewController的初始化过程中,因此在没有进入到对应的视图时是看不到它TabBarItem的效果,这时候只好在storyboard中就先设置好它的样式,但是进入到对应的视图时又发现storyboard中的样式覆盖了代码中的样式,让人十分费解。最终我自己自定义视图来实现Tabbar效果,隐藏了原来TabBar的视图,功能方面继续使用UITabBarController提供的功能。代码如下:
#import <UIKit/UIKit.h>
@interface TabBarViewController : UITabBarController {
UIButton *btnNews, *btnCollect, *btnMore;
}
@end
说明:继承UITabBarController,实例变量为通过UIButton模拟的三个UITabBarItem。
实现部分的主要代码:
- (void)viewDidLoad
{
[super viewDidLoad];
//实例化一个普通View来做TabBar,位置和大小跟原本的TabBar一样
UIView *tabBarView = [[UIView alloc] initWithFrame:self.tabBar.frame];
tabBarView.contentMode = UIViewContentModeScaleToFill;
//获取TabBar的宽和高
float navBarW = self.tabBar.frame.size.width;
float navBarH = self.tabBar.frame.size.height;
//实例化三个UIButton来模拟TabBarItem,配置它们的样式和点击事件
btnNews = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, navBarW / 3, navBarH)];
[btnNews setBackgroundImage:[UIImage imageNamed:@"news.png"] forState:UIControlStateNormal];
[btnNews setBackgroundImage:[UIImage imageNamed:@"news3.png"] forState:UIControlStateHighlighted];
[btnNews setBackgroundImage:[UIImage imageNamed:@"news2.png"] forState:UIControlStateDisabled];
[btnNews addTarget:self action:@selector(barButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
btnCollect = [[UIButton alloc] initWithFrame:CGRectMake(navBarW / 3, 0, navBarW / 3, navBarH)];
[btnCollect setBackgroundImage:[UIImage imageNamed:@"collectbar.png"] forState:UIControlStateNormal];
[btnCollect setBackgroundImage:[UIImage imageNamed:@"collectbar2.png"] forState:UIControlStateDisabled];
[btnCollect setBackgroundImage:[UIImage imageNamed:@"collectbar3.png"] forState:UIControlStateHighlighted];
[btnCollect addTarget:self action:@selector(barButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
btnMore = [[UIButton alloc] initWithFrame:CGRectMake(navBarW * 2 / 3, 0, navBarW / 3, navBarH)];
[btnMore setBackgroundImage:[UIImage imageNamed:@"more.png"] forState:UIControlStateNormal];
[btnMore setBackgroundImage:[UIImage imageNamed:@"more2.png"] forState:UIControlStateDisabled];
[btnMore setBackgroundImage:[UIImage imageNamed:@"more3.png"] forState:UIControlStateHighlighted];
[btnMore addTarget:self action:@selector(barButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
//把三个按钮添加到自己的TabBar上
[tabBarView addSubview:btnNews];
[tabBarView addSubview:btnCollect];
[tabBarView addSubview:btnMore];
//把自己的TabBar放到原来的TabBar的父级视图上
[self.tabBar.superview addSubview:tabBarView];
//隐藏掉原来的TabBar
[self.tabBar setHidden:YES];
}
//三个TabBar的点击实践
- (void)barButtonClicked:(id)sender {
UIButton *barButton = (UIButton *)sender;
if (barButton == btnNews) {
//这是调用UITabBarController切换视图的方法
[self setSelectedIndex:0];
barButton.enabled = NO;
btnCollect.enabled = YES;
btnMore.enabled = YES;
} else if (barButton == btnCollect) {
[self setSelectedIndex:1];
barButton.enabled = NO;
btnMore.enabled = YES;
btnNews.enabled = YES;
} else if (barButton == btnMore) {
[self setSelectedIndex:2];
barButton.enabled = NO;
btnNews.enabled = YES;
btnCollect.enabled = YES;
}
}
别忘了将storyboard或者xib中将UITabBarController设置为自己的Controller,如图:
最终效果图:
每个按钮上的图标、文字、背景都是一整个图片,完全可以做出自己想要的外观。
隐藏TabBar
当进入详细页面时,可能需要将下面的TabBar隐藏掉。如果视图是通过导航栏控制器管理的,在详细视图的viewDidLoad方法里直接调用[self hidesBottomBarWhenPushed]应该就可以隐藏掉TabBar。由于这里的TabBar视图是自定义实现的,因此同时需要自己来隐藏这个自定义视图。经过实际测试发现TabBar视图被隐藏后会在原地留下一个黑框,通过设置其他视图的bounds来试图占满屏幕也没有效果,不知道是iOS本身的bug还是因为我用了自定义实现的原因。总之在网上也有其他网友遇到这样的问题。最终通过这篇【博客】找到了解决办法。
我将实现代码作为函数放到了自定义的TabBarViewController中,如下:
- (void)setTabBarHidden:(BOOL)abool {
if (abool) {
[self performSelector:@selector(setTabBarHiddenNow:) withObject:[NSNumber numberWithBool:abool] afterDelay:0.4f];
} else {
[self setTabBarHiddenNow:[NSNumber numberWithBool:abool]];
}
}
- (void)setTabBarHiddenNow:(NSNumber *)aboolNum {
BOOL abool = aboolNum.boolValue;
UIView *contentView;
if ( [[self.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]] ) {
contentView = [self.view.subviews objectAtIndex:1];
} else {
contentView = [self.view.subviews objectAtIndex:0];
}
if (abool) {
contentView.frame = CGRectMake(contentView.bounds.origin.x, contentView.bounds.origin.y, contentView.bounds.size.width, contentView.bounds.size.height + self.tabBar.frame.size.height);
} else {
contentView.frame = CGRectMake(contentView.bounds.origin.x, contentView.bounds.origin.y, contentView.bounds.size.width, contentView.bounds.size.height - self.tabBar.frame.size.height);
}
tabBarView.hidden = abool;
}
说明:主要思路就是将改变内容视图的bounds,为其加上或者减去TabBar的高度。这里我在隐藏TabBar时做了延迟0.4秒的操作,是因为实际测试发现,在切换视图并且有动画效果时,上一个视图在离开屏幕的过程中下面的TabBar变成了黑色区域,如果延迟0.4秒就可以避免这样的问题,使隐藏效果也更加自然。
详细视图加载和退出时调用隐藏函数。分别如下:
TabBarViewController *tabBarViewController = (TabBarViewController *)self.tabBarController;
[tabBarViewController setTabBarHidden:YES];
和
TabBarViewController *tabBarViewController = (TabBarViewController *)self.tabBarController;
[tabBarViewController setTabBarHidden:NO];