IOS工作笔记(十)

1.关于textField

在做一些操作,比如登录时账号或密码为空的处理时,有两种方案。
①登录按钮可以点击,但会用alertView提示“账号或密码为空”的消息。
②此时登录按钮不可点击,只有账号和密码都有值时,才可以点击。
两种方法推荐第二种,体验较好。此时需要实现UITextFieldDelegate,并且

1 - (BOOL)textFieldShouldClear:(UITextField *)textField{
2     //清空内容时同时使按钮不可点击
3     _saveBtn.enabled = NO;
4     return YES;
5 }
6 //该方法表示是否允许根据请求清空内容.

2.当一个view内有多个UIActionSheet时,可以对actionSheet设置不同的tag值,再根据tag值处理选项。如

 1 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
 2     switch (actionSheet.tag) {
 3         case 1:
 4             switch (buttonIndex) {
 5                 case 0:
 6                     NSLog(@"点击了0");
 7                     break;
 8
 9                 default:
10                     break;
11             }
12             break;
13
14         case 2:
15             switch (buttonIndex) {
16                 case 0:
17                     NSLog(@"点击了3");
18                     break;
19
20                 case 1:
21                     NSLog(@"点击了4");
22                     break;
23
24                 default:
25                     break;
26             }
27             break;
28
29         default:
30             break;
31     }
32 }

3.对于代理和赋值方法的处理。

现有两个方法,一个代理方法,另一个是对cell进行赋值的cellForRowAtIndexPath。

//代理方法,执行晚于cellForRowAtIndexPath,但会回调。
-(void)getData:(NSArray *)arr{
    //
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //
}

有一个数组arr,由代理方法进行赋值,然后将arr里的数据对cell赋值。但程序运行时,先执行cellForRowAtIndexPath,因此需要设置一个值,用来标记是否对arr赋值。

处理方法是设置一个BOOL值_isValued,设其初始值为NO,然后在代理方法中设为YES,再对cell进行赋值即可。

 1 //该方法比代理方法先执行
 2 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 3     if(_isValued){
 4         //进行赋值操作
 5     } else {
 6         //设置空白cell
 7     }
 8 }
 9
10 -(void)getData:(NSArray *)arr{
11     //其它操作
12     //赋值完毕后,设置
13     _isValued = YES;
14 }

关键在于_isValue的设立。

[email protected]方法可以定义,然后直接使用

对于没参数的

1 SEL sel = @selector(refreshPersonDataByNotification);
2 [[NSNotificationCenter defaultCenter] addObserver:self selector:sel name:imgTextChannelNotification object:nil];
3
4 //刷新数据
5 -(void)refreshPersonDataByNotification{
6     [_tableView refreshLoad];
7 }

有参数的可以这样写

SEL sel = @selector(write:andAge:);
-(void)write andAge:(NSString *)age{
    //
}

5.若不同的.m有多个操作,每个操作都发送一个通知,但该操作都执行同一项任务,那么在注册监听者时,无需注册多个不同名称的通知,只需一个即可。

如:

1 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshData) name:note1 object:nil];
2 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshData) name:note2 object:nil];
3 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshData) name:note3 object:nil];

完全可以合为1个,只要通知的名称统一即可。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshData) name:note object:nil];

声明通知的name时推荐使用

NSString * const AnyNotificationName = @"notiName";

因为使用下面的写法有可能出现警告:sending ‘const NSString *__strong‘ to parameter of type ‘NSString‘ discards qualifiers

const NSString *AnyNotificationName = @"notiName";

6.关于继承的一些回顾

子类继承父类后,子类就会带有父类的所有public性质的方法和属性。如在一个父类的UIView的.h中

 1 @interface ViewFather : UIView{
 2 @public
 3     UILabel *_lab;
 4 }
 5
 6 @property(nonatomic,strong) UIButton *firstBtn;
 7 @property(nonatomic,strong) UIButton *secondBtn;
 8 @property(nonatomic,strong) UIButton *thirdBtn;
 9
10 @end

子类继承后,

@interface ViewSon : ViewFather

@end

那么可以通过self.firstBtn这样的来获取到用property修饰的属性,但若想获取_lab这样的,就只能通过

self->_lab

来获取,并且类似于

{
@public
    UILabel *_lab;
}

这样的,若想让子类继承,只能写到父类的.h中,.m中在子类中是获取不到的。
对于方法,若方法名相同,则子类会覆盖父类中的方法。若不同,则会执行两个方法。如下:
父类中有

 1 UIButton *firBtn = [UIButton buttonWithType:UIButtonTypeCustom];
 2 [firBtn setTitle:@"第一个" forState:UIControlStateNormal];
 3 [firBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
 4 firBtn.frame = CGRectMake(100, 50, 100, 50);
 5 firBtn.layer.cornerRadius = 20;
 6 firBtn.backgroundColor = [UIColor brownColor];
 7 self.firstBtn = firBtn;
 8 [self.firstBtn addTarget:self action:@selector(alertMsg) forControlEvents:UIControlEventTouchUpInside];
 9 [self addSubview:firBtn];
10
11 -(void)alertMsg{
12     UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"第一项",@"第二项",@"第三项", nil];
13     [sheet showInView:self];
14 }

子类中则有

1 [self.firstBtn addTarget:self action:@selector(alertMsg2) forControlEvents:UIControlEventTouchUpInside];
2
3 -(void)alertMsg2{
4     UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"哈哈",@"嘿嘿",@"呼呼", nil];
5     [sheet showInView:self];
6 }

那么就会出现像下面这样的

时间: 2024-11-08 01:56:34

IOS工作笔记(十)的相关文章

iOS工作笔记(十二)

1.从ControllerA跳往照相UIImagePickerController,只能用presentViewController形式,因为定义UIImagePickerController时, UIImagePickerController *pickerController = [[UIImagePickerController alloc]init]; pickerController.allowsEditing = NO; pickerController.delegate = sel

iOS工作笔记(十四)

1.scrollview的frame指的是其可视范围,contentSize指的是其滚动范围,分别是在水平方向和竖直方向上的 所以要让scrollview在水平方向不能滚动,那么需要如下设置 _scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight)]; _scrollView.contentSize = CGSizeMake(0, kScreenHeight*3);

iOS工作笔记(十五)

1.使用MJRefresh上拉加载的小细节 MJRefreshBackGifFooter *footer = [MJRefreshBackGifFooter footerWithRefreshingBlock:^{ [_searchResultView.mj_footer endRefreshing]; //加载新内容 [self loadMoreItemList]; }]; 这样写的效果是,当下拉加载时,新内容是不直接展现的,还得继续往上拉,才能看到新内容 当换种写法,将endRefreshi

iOS工作笔记之NSClassFromString

id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init]; 和 id myObj = [[MySpecialClass alloc] init]; 是一样的.但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已. 因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化. 比如在iPhone中,NSTask可能就会出现这种情

IOS工作笔记(二)

1.懒加载(即延迟加载)只有被调用时才初始化,防止资源浪费,需要重写对象 的get方法,且必须写成成员变量形式,如_imageData.可以这么写,如: 1 @property(nonatomic,strong) NSArray *imageData; 2 3 -(NSArray *)imageData{ //重写imageData的get方法 4 if(_imageData == nil){ 5 //初始化数据 6 NSMutableDictionary *image1 = [NSMutabl

IOS工作笔记(五)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.frame的打印,可以用 NSLog(@"%@",NSStringFromCGRect(self.view.frame)); 2.UIButton文字的对齐方式,以左对齐为例 myBtn.titleLabel.textAlignment = NSTextAlignmentLeft;//这种设置方式无效 myBtn.contentHorizontalAlignment = UIControlConte

IOS工作笔记(三)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.选定ipad支持的方向,如强制横屏等,需要在General——>Deployment Info ——>Device Orientation选择,含义如下: 所以要想强制横屏的话,可以点选 2.UIView中如何添加xib文件? 如新建一个UIView为DocDetailView,那么建的那个xib文件在custom class中class应写成跟UIView名字一样的,这里要写成DocDetailView,

IOS工作笔记(七)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.在定义UITableViewCell时,组件可以直接加,也可以添加到contentView中 [self addSubViews:myBtn]; [self.contentView addSubViews:myBtn]; 但最好添加在contentView中,因为contentView可以定义很多东西. 2.关于下拉刷新和上拉加载,可以用是第三方框架MJRefresh,地址在 https://github.c

IOS工作笔记(四)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.ios7中,对状态栏的调整是在控制器中进行的. 1 //设置状态栏为白色 2 -(UIStatusBarStyle)preferredStatusBarStyle{ 3 return UIStatusBarStyleLightContent; 4 } 5 //隐藏状态栏 6 -(BOOL)prefersStatusBarHidden{ 7 return YES; 8 } 2.给UIImageView或UILa