1、
此方法会在所在cell滑出屏幕外的时候崩溃报错
StoreConLabTableViewCell *endTCell = [self.tableView cellForRowAtIndex
Path:[NSIndexPath indexPathForRow:4 inSection:1]];
2、
拼接90%这种加百分号字符串的时候 用 %% 这样两个%%来表示%。
3、
为了不让弹出键盘挡住输入框。一般
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
if (textField.tag == 888) {
[UIView animateWithDuration:0.26 animations:^{
self.view.frame=CGRectMake(0, -50, WIDTH, HEIGHT);
}];
}
在如上方法中上移界面,配合使用下面代理方法使恢复
-(void)textFieldDidEndEditing:(UITextField *)textField
{
if (textField.tag==12) {
[UIView animateWithDuration:0.26 animations:^{
self.view.frame=CGRectMake(0, 0, WIDTH, HEIGHT);
}];
}
}
有时候界面是tableView的时候也可在上面第一个代理方法中使tableView滚动到相应位置
[UIView animateWithDuration:0.26 animations:^{
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:1 animated:YES];
}];//这里可以不用考虑恢复,tableview可以人为滚动回来
这里需要注意的不能忘记<UITextFieldDelegate>,并且给需上移界面的textField标记tag,并且写上
textField.delegate = self
4、
可以通过给textField绑定方法,根据后面UIControlEvent..不同来实现不同方法,如:
[textfield addTarget:self action:@selector(change:) forControlEvents:
UIControlEventEditingChanged];
然后在中实时获取输入文本,textField多的话一样需要tag标记
-(void)change:(UITextField*)textField{
NSString *str = textField.text
}
5、
实现此cell四周间隙界面
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
此行代码先去掉所有分割线
//圆角
self.layer.cornerRadius = 8;
self.layer.masksToBounds = YES;
//配合圆角使用(待了解,性能相关)
self.contentView.layer.shouldRasterize = YES;
self.contentView.layer.rasterizationScale = [[UIScreen mainScreen] scale];
//间隙处理:写在cell中
- (void)setFrame:(CGRect)frame {
static CGFloat const margin = 10;
frame.size.width -= 2 * margin;
frame.origin.x = margin;
frame.size.height -= margin;
frame.origin.y += margin;
[super setFrame:frame];
}
6、
百度地图集成成功后获取经纬度、城市名称、城市编码
一
//导入对应控制器
#import "AppDelegate.h"
#import <BaiduMapAPI_Utils/BMKUtilsComponent.h>
#import <BaiduMapAPI_Search/BMKSearchComponent.h>
#import <BaiduMapAPI_Map/BMKMapComponent.h>
#import <BaiduMapAPI_Location/BMKLocationComponent.h>
二
BMKLocationService* _locService;//定位
BMKOfflineMap * _offlineMap;//离线地图相关(用于获取城市编码)
//用于保存
NSString *longitudeStr;//经度
NSString *latitudeStr;//纬度
NSString *localStr;//城市
NSString *cityCode;//编码
三
在viewDidLoad中调用启动定位
- (void)startMap{
_locService = [[BMKLocationService alloc]init];//定位功能的初始化
_locService.delegate = self;//设置代理位self
//启动LocationService
[_locService startUserLocationService];//启动定位服务
_offlineMap = [[BMKOfflineMap alloc] init];
}
四
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{
BMKCoordinateRegion region;
region.center.latitude = userLocation.location.coordinate.latitude;
region.center.longitude = userLocation.location.coordinate.longitude;
region.span.latitudeDelta = 0;
region.span.longitudeDelta = 0;
NSLog(@"当前的坐标是:%f,%f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
//获取经纬度
longitudeStr = [NSString stringWithFormat:@"%f",userLocation.location.coordinate.longitude];
latitudeStr = [NSString stringWithFormat:@"%f",userLocation.location.coordinate.latitude];
// ApplicationDelegate
ApplicationDelegate.latitude = latitudeStr;
ApplicationDelegate.longitude = longitudeStr;
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation: userLocation.location completionHandler:^(NSArray *array, NSError *error) {
if (array.count > 0) {
CLPlacemark *placemark = [array objectAtIndex:0];
if (placemark != nil) {
NSString *city = placemark.locality;
NSLog(@"当前城市名称------%@",city);
self.locationCityName.text = city;
localStr = city;
NSArray* records = [_offlineMap searchCity:city];
BMKOLSearchRecord* oneRecord = [records objectAtIndex:0];
//城市编码如:北京为131
int cityId = oneRecord.cityID;//获取编码
cityCode = [NSString stringWithFormat:@"%d",oneRecord.cityID];
ApplicationDelegate.cityCode = cityCode;//全局保存地理
[[XFBConfig Instance] saveCityCode:cityCode];
if ([_offlineMap remove:cityId]) {
}else{
};
[self loadHotStoreAndTuiJianStoreData];//根据定位加载商家
[_locService stopUserLocationService];
}
}
}];
}
7、
存在底部标签栏控制器进入没有标签栏控制器,来回切换错乱问题
- (void)pushToNextWithIdentiField:(NSString*)identi sender:(id)sender{
self.hidesBottomBarWhenPushed = YES;//隐藏
[self performSegueWithIdentifier:identi sender:sender];
self.hidesBottomBarWhenPushed = NO;//必须要,否则回来时标签仍然消失
}
//在跟控制器面板中hidesBottomBarWhenPushed有时候需要取消勾选,有可能会影响
//整体界面偏移问题
没有导航看界面进入有导航栏界面,一般在上个控制器viewWillAppear中写[self.navigationController setNavigationBarHidden:YES animated:animated];
然后再下个界面在设置为no, 一般遇到错乱问题 ,优先考虑使用 setNavigationBarHidden方法 而不是self.navigationController.navigationBarHidden =
8、
通过地图移动 ,使大头针移到相应位置获取对应经纬度
一、先导入
#import <BaiduMapAPI_Base/BMKBaseComponent.h>//引入base相关所有的头文件
#import <BaiduMapAPI_Map/BMKMapComponent.h>//引入地图功能所有的头文件
#import <BaiduMapAPI_Search/BMKSearchComponent.h>//引入检索功能所有的头文件
#import <BaiduMapAPI_Cloud/BMKCloudSearchComponent.h>//引入云检索功能所有的头文件
#import <BaiduMapAPI_Location/BMKLocationComponent.h>//引入定位功能所有的头文件
#import <BaiduMapAPI_Utils/BMKUtilsComponent.h>//引入计算工具所有的头文件
#import <BaiduMapAPI_Map/BMKMapView.h>//只引入所需的单个头文件
二、画图
屏幕快照 2017-01-05 下午5.29.48.png此处注意,大头针button视图在mapView的上层,经纬度label视图跟mapView平级,在self.view上,
三、在 .m 中
@interface MapLocateViewController ()<BMKMapViewDelegate,BMKGeoCodeSearchDelegate,BMKLocationServiceDelegate>
{
BMKGeoCodeSearch *_geoCodeSearch;
BMKReverseGeoCodeOption *_reverseGeoCodeOption;
BMKLocationService *_locService;
}
@property (weak, nonatomic) IBOutlet BMKMapView *mapView;
@property (weak, nonatomic) IBOutlet UIButton *mapPin;//大头针
@property (weak, nonatomic) IBOutlet UILabel *longtitudeLab;//经度
@property (weak, nonatomic) IBOutlet UILabel *latitudeLab;//纬度
@end
@implementation MapLocateViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self initLocationService];
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[_mapView viewWillAppear];
_mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[_mapView viewWillDisappear];
_mapView.delegate = nil; // 不用时,置nil
}
#pragma mark 初始化地图,定位
-(void)initLocationService
{
[_mapView setMapType:BMKMapTypeStandard];// 地图类型 ->卫星/标准、
_mapView.zoomLevel=17;
_mapView.delegate=self;
_mapView.showsUserLocation = YES;
[_mapView bringSubviewToFront:_mapPin];
if (_locService==nil) {
_locService = [[BMKLocationService alloc]init];
[_locService setDesiredAccuracy:kCLLocationAccuracyBest];
}
_locService.delegate = self;
[_locService startUserLocationService];
_mapView.showsUserLocation = NO;//先关闭显示的定位图层
_mapView.userTrackingMode = BMKUserTrackingModeFollow;//设置定位的状态
_mapView.showsUserLocation = YES;//显示定位图层
}
#pragma mark BMKLocationServiceDelegate
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
_mapView.showsUserLocation = YES;//显示定位图层
//设置地图中心为用户经纬度
[_mapView updateLocationData:userLocation];
BMKCoordinateRegion region ;//表示范围的结构体
region.center = _mapView.centerCoordinate;//中心点
region.span.latitudeDelta = 0.004;//经度范围(设置为0.1表示显示范围为0.2的纬度范围)
region.span.longitudeDelta = 0.004;//纬度范围
[_mapView setRegion:region animated:YES];
}
#pragma mark BMKMapViewDelegate
- (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
//屏幕坐标转地图经纬度
CLLocationCoordinate2D MapCoordinate=[_mapView convertPoint:_mapPin.center toCoordinateFromView:_mapView];
//获取经纬度
self.latitudeLab.text = [NSString stringWithFormat:@"%f",MapCoordinate.latitude];
self.longtitudeLab.text = [NSString stringWithFormat:@"%f",MapCoordinate.longitude];
if (_geoCodeSearch==nil) {
//初始化地理编码类
_geoCodeSearch = [[BMKGeoCodeSearch alloc]init];
_geoCodeSearch.delegate = self;
}
if (_reverseGeoCodeOption==nil) {
//初始化反地理编码类
_reverseGeoCodeOption= [[BMKReverseGeoCodeOption alloc] init];
}
//需要逆地理编码的坐标位置
_reverseGeoCodeOption.reverseGeoPoint =MapCoordinate;
[_geoCodeSearch reverseGeoCode:_reverseGeoCodeOption];
}
//此方法可获取周边信息
#pragma mark BMKGeoCodeSearchDelegate
-(void) onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error
{
//获取周边用户信息
if (error==BMK_SEARCH_NO_ERROR) {
// [self.cityDataArr removeAllObjects];
for(BMKPoiInfo *poiInfo in result.poiList)
{
//用自定义一个model来接受信息
// cityModel *model=[[cityModel alloc]init];
// model.name=poiInfo.name;
// model.address=poiInfo.address;
// CLLocationCoordinate2D _pt
//用列表来展示获取的信息
// [self.cityDataArr addObject:model];
// [self.cityTableview reloadData];
}
}else{
NSLog(@"BMKSearchErrorCode: %u",error);
}
}
9、
在店铺管理界面,上传图片时,上传图片的控制器继承了一个专门用来处理打开相册然后单选或多选图片的一个根控制器。 在每次选取完后我都在跟控制器的- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
的方法里写了一个block,如图
结果每次直接带出来的图片上传成功并直接赋值成功后,如图
F5935665-B273-4C16-BF08-0FF83DE3384C.png都会内存暴涨(【可能】原因本属于父子控制器并不能这样用block处理传值)
解决:在根控制器中写了一个方法
屏幕快照 2017-01-06 上午9.33.37.png
然后在
6D376D69-A073-43AE-8B75-FBD282054281.png 84474583-FB56-4F86-ADFD-80F4E486D636.png如此获取image并上传并且赋值后,内存依然会涨,但退出该页面后,内存也降下来了
总结:父子控制器传值一般直接在父控制器写一个方法(并在里面赋值),然后子控制器直接调用该方法,即可获取该值==>
10、
JSONModel的使用:
建立model类继承JsonModel
1、解一个独立model,
model.h类:
@interface AccountModel : JSONModel
@property (nonatomic,strong) NSString *createtime;
@property (nonatomic,strong) NSString *createdate;
@end
model.m:
@implementation AccountModel
@end
API中:
AccountModel *Model = [[AccountModel alloc]initWith
Dictionary:responseObject[@"data"] error:&error];
2解出一个array(类似如下,解出list)
{
"code": "1",
"data": {
"list": [
{ "account_description": "在商家",
"createdate": "01-06",
"createtime": "11:09"
}
、、、
、、、
]
}
}
model类如下,.h中
4800173A-D491-4CEF-9AF3-5242D1D5A3B6.png
.m中
屏幕快照 2017-01-09 下午4.08.23.png
API中:
NSMutableArray *accountArr = [NSMutableArray array];
NSError *err = nil;//都要写
NSArray *data = responseObject[@"data"][@"list"];
accountArr = [AccountModel arrayOfModelsFromDictionaries:data
error:&err];
如果涉及后台给的字段有@“id” 或者@“description”,可以通过方法转换下即可