首页 > 代码库 > IOS工作笔记(二)
IOS工作笔记(二)
1.懒加载(即延迟加载)只有被调用时才初始化,防止资源浪费,需要重写对象 的get方法,且必须写成成员变量形式,如_imageData。可以这么写,如:
1 @property(nonatomic,strong) NSArray *imageData; 2 3 -(NSArray *)imageData{ //重写imageData的get方法 4 if(_imageData =http://www.mamicode.com/= nil){ 5 //初始化数据 6 NSMutableDictionary *image1 = [NSMutableDictionary dictionary]; 7 image1[@"icon"] = @"hello"; 8 image1[@"desc"] = @"这是一张图片的说明"; 9 10 NSMutableDictionary *image2 = [NSMutableDictionary dictionary];11 image2[@"icon"] = @"hello2";12 image2[@"desc"] = @"这是一张图片的说明2";13 14 //self.imageData = http://www.mamicode.com/@[image1,image2];//原来的写法15 _imageData = http://www.mamicode.com/@[image1,image2]; //懒加载的写法16 17 }18 return _imageData;19 }
上述get方法不能这样写
1 -(NSArray *) imageData{2 if(self.imageData =http://www.mamicode.com/= nil){3 //4 }5 return self.imageData;6 }
因为这样写会陷入死循环,self.imageData 调用的就是imageData的get方法,所以得写成成员变量"_imageData"这种形式的。
2.当数据量较多时,可以把数据存储在plist文件中,读取plist文件可以这样来,固定格式,3行。
//一个bundle就表示一个文件夹,利用mainBundle可以访问手机的任何资源NSBundle *bundle = [NSBundle mainBundle];//获取plist文件路径,并且这种路径是全路径,而不单单是通过文件名获取NSString *path = [bundle pathForResource:@"imageData" ofType:"@"plist"];_imageData =http://www.mamicode.com/ [NSArray arrayWithContentOfFile:path];//一般含File的路径必须是全路径,而不是和imageNamed的那样,只提供名称就行。
3.出现这种错误:
undefined symbols for architecture arm64:
"_OBJC_CLASS_$_BMKMapView", referenced from:"………………
这是程序不支持64位命令,有两种修改方法
①在target的build settings中的valid Architectures ,将arm64删除,并将Build Active Architecture Only设为NO,即可。
②另一种是只需修改Architectures的Architectures改为
${ARCHS_STANDARD_32_BIT}
即可,原来的为
$(ARCHS_STANDARD)
4.关于UIButton的点击事件,若将一个btn添加到view里面
[self addSubView:btn];
若该button的坐标位于view之外,那么button就接受不到按钮事件。其余的类似
5.viewWithTag可以根据tag值很快地获取到所需要的view,不过对tag的大小有要求,因为tag值较小的,如0——100为苹果保留所用。
所以我们自定义时需要把tag设的很大才行,如100000.
6.userInteractionEnabled是UIView的属性,可以设置视图是否可以接受用户的事件和消息,是否可以跟用户交互。若不想,设置为NO即可。
如当一个父视图中包含两个子视图a,b。但b被a覆盖了,这样b就不能响应事件,这时若设置
a.userInteractionEnabled = NO;b.userInteractionEnabled = YES;
这样b就可以接收到消息事件了。
7.keyWindow是用来接受键盘以及非接触类的信息,而且每个程序中都只能有一个window是keywindow.
//定义keywindowUIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
8.获取UIButton上的文字,可以用
myButton.titleLabel.text
9.定义可变数组及初始化
1 @property(strong, nonatomic) NSMutableArray *allMedicBtn; 2 3 -(NSMutableArray *) allMedicBtn{ 4 if(!_allMedicBtn){ 5 _allMedicBtn = [NSMutableArray array];//第20条笔记讲述这样写的原因 6 } 7 return _allMedicBtn; //return self.allMedicBtn 8 //这里_allMedicBtn相当于self.allMedicBtn,这其实调用的是allMedicBtn的get方法,因此这两种写法是等价的 9 // self.allMedicBtn 与 _allMedicBtn;10 }
10.[NSMutableArray array]和[[NSMutableArray alloc] init]的区别;
[NSMutableArray array]相当于[[[NSMutableArray alloc] init] autorelease],autorelease的对象有时会在不用的时候已经release了,后面想用时还得retain一次。
11.xcode的快捷键
xocde没有eclipse那样的花括号成对的提示符,只能双击任一花括号,成对的花括号就会以阴影形式出现。
展开、闭合单一方法,快捷键是 command + option + 左右键,(左键闭合,右键展开)
要想对所有方法做这些操作,需要加shift,command + option + shift + 左右键
12.在普通的view中,一些方法可以加载initWithFrame中,如:
1 -(id)initWithFrame:(CGRect)frame{2 self = [super initWithFrame:frame];3 if (self) {4 //添加选择器5 [self setupChoiceView];6 }7 return self;8 }
但在tableViewCell中,这些方法最好写在initWithStyle中,方便复用。如
1 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier2 {3 if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {4 //自定义方法5 [self setupFTEHitorySwitchBtn];6 }7 return self;8 }
13.ios中坐标的定义,当把UIView添加到keyWindow后,view相对的坐标原点就会发生变化,ipad横屏程序中,默认进入主页时的home键是位于左边的,此时的坐标原点应该位于右上角(倒过来看还是左上角)。
而假如不是加入到keyWindow中,那么坐标原点还是位于左上角。
而对于keyWindow的定义是在appDelegate中进行的,如
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{2 self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];3 self.window.rootViewController = [[LoginViewController alloc]init];4 [self.window makeKeyAndVisible];5 6 return YES;7 }
对于这种问题,则可以这么解决(这是view中添加view)
①在view的.h文件中,添加新方法。如
1 @class HomeViewController; //为下边的方法要使用的类提供接口2 @interface MedicineSelectView:UIView3 -(id)initWithFrame:(CGRect) frame andSuperViewController:(HomeViewController *) home;4 @end
②在view的.m文件中添加自定义的方法,原来的方法不再需要。原来的为
1 -(id)initWithFrame:(CGRect)frame{2 self = [super initWithFrame:frame];3 if(self){4 [self setupAddMedicineBtn];5 }6 return self;7 }
此时,上述方法应改为
1 -(id)initWithFrame:(CGRect) frame andSuperViewController:(HomeViewController *) home{ 2 self = [super initWithFrame:frame]; 3 if(self){ 4 self.home = home; //当然还需要在.m中声明如下 5 /** 6 *@property (weak, nonatomic) UIViewController *home; 7 *因为self.home = home中等号左边的home是指的property的home,等号右边的home是方法中的参数 8 */ 9 [self setupAddMedicineBtn];10 }11 return self;12 }
③在view的.m文件中添加该view时也会发生变化。原来是添加到keyWindow内,如
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];[keyWindow addSubView:self.allMedicineView];
改变后的方法是将view添加到controller所在的view
[self.home.view addSubview:self.allMedicineView];
④在要将该view添加的controller中,定义该view的大小位置时也需变化。
原来的是
MedicineSelectView *medicineView = [[MedicineSelectView alloc] initWithFrame:CGRectMake(0, 0, 300, 44)];
改变后的是
MedicineSelectView *medicineView = [[MedicineSelectView alloc] initWithFrame:CGRectMake(0, 0, 300, 44) andSuperViewcontroller:self];//self指的是要添加该view的控制器
14.ipad解决键盘遮住文本框的问题,这种方法较简单,是用来监听文本框的。如有两个文本框userName,passWord(都为UITextField),那么可以这样。
①先对两个文本框添加监听事件,这里只以userName为例
1 [userName addTarget:self action:@selector(textFieldBeginEdit:) forControlEvents:UIControlEventEditingDidBegin];2 [userName addTarget:self action:@selector(textFieldEndEdit:) forControlEvents:UIControlEventEditingDidEnd];
②添加具体的移动方法
//开始编辑时,整体上移-(void)textFieldBeginEdit:(UITextField *)textField{ [self moveView:-230]; }//结束编辑后,移回原来位置-(void)textFieldEndEdit:(UITextField *)textField{ [self moveView:230];}//view移动的具体方法-(void) moveView:(float)move{ NSTimeInterval animationDuration = 0.3f; CGRect frame = self.view.frame; frame.origin.x += move; //view的X轴上移 self.view.frame = frame; [UIView beginAnimations:@"2" context:nil];// 2是动画的标识 [UIView setAnimationDuration:animationDuration]; self.view.frame = frame; [UIView commitAnimations];}
③点击其它区域和键盘右下角“隐藏键盘”那个按钮时隐藏键盘,写在viewDidLoad里
- (void)viewDidLoad { //点击其他区域关闭键盘 UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(hideKeyBoard)]; gesture.numberOfTapsRequired = 1; //确认是单击其他区域,而不是双击等其它操作 [self.view addGestureRecognizer:gesture]; //该方法特别重要 //点击键盘右下角“隐藏键盘”那个按钮,关闭键盘并且恢复view的位置 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideKeyBoard) name:UIKeyboardWillHideNotification object:nil];}//隐藏键盘,并且view恢复初始位置-(void)hideKeyBoard{ [userName resignFirstResponder]; [passWord resignFirstResponder]; [self resumeView];}//恢复view的原来位置-(void)resumeView{ NSTimeInterval animationDuration=0.5f; [UIView beginAnimations:@"3" context:nil]; [UIView setAnimationDuration:animationDuration]; [UIView commitAnimations];}
15.UITableViewCell的重用,比如表格有100行数据,每页只能显示10行,则当向下划时,第11行出现,第1行消失时,为了节约内存,就要将第1行的cell复用到第11行。代码如下:
+(instancetype) cellWithTableView:(UITableView *) tableView{ static NSString *ID = @"MedicineProcessCell"; MedicineProcessView *cell = [tableView dequeueReusableCellWithIdentifier:ID]; //表示定义一个cell,在tableView的可重用队列中寻找有MedicineProcessCell标识的UITableViewCell,已进行重用 //如果队列中有这样的UITableView,则把它赋值给cell;若没有,则返回nil给cell if(!cell){ cell = [[MedicineProcessView alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID]; } return cell;}
IOS工作笔记(二)