1.今天在学习的过程中连续遇到了两个让我很意外的情况。
1)我设置tableViewDelegate,TableViewDataSource之后,cell并不能填充。
2)设置UIActionSheetDelegate之后,发现相应的方法不能调用的情况。
至于其中的原因,我相信是多种多样的 。我就先说说在处理此问题我的经验
2.
1)我设置tableViewDelegate,TableViewDataSource之后,cell并不能填充。
- 确定我们的tableView是不是已经全部的添加了 self.tableview.delegate = self,self.tableview.datasource =self 这两句话。如果没有添加请添加。如果是xib视图,可以拖拽添加或者代码添加。
先看看之前代理不响应的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
//顺序的变化也将导致无法加载数据
[self.view addSubview:self.myTableView];
self.array = [NSMutableArray arrayWithArray:[UIFont familyNames]];
// self.array = [NSArray arrayWithObjects:@"lichan",@"dahuang",@"<#string#>", nil]
self.myTableView.dataSource = self;
self.myTableView.delegate = self;
//数组的初始化
self.myTableView = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
// Do any additional setup after loading the view from its nib.
}
2)如果如上所写,我们的tableView的代理方法指定是不会调用的。原因呢?这就是我们今天要说的,代理的设置位置一定是在我们alloc init tableview之后再设置,而非我们上述代码的先设置代理再初始化。
正确的代理设置如下:
- (void)viewDidLoad
{
[super viewDidLoad];
//顺序的变化也将导致无法加载数据
self.myTableView = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
[self.view addSubview:self.myTableView];
self.array = [NSMutableArray arrayWithArray:[UIFont familyNames]];
// self.array = [NSArray arrayWithObjects:@"lichan",@"dahuang",@"<#string#>", nil]
self.myTableView.dataSource = self;
self.myTableView.delegate = self;
//数组的初始化
// Do any additional setup after loading the view from its nib.
}
3.这个是在 viewDidLoad中设置的代理。那么下面又不能调用代理的情况又出现了
1)代码叙述
viewdidload中
{
//省略其他代码
self.actionSheet.delegate = self;
}
在tableView的一个代理方法中
#pragma mark tableViewDelegate
//调整行高,上标题,下标题的高度 ,行行之间的偏移
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger row = [indexPath row];
NSString *string = [NSString stringWithFormat:@"第 %d 行 被选中!",row+1];
// UIAlertView *view = [[UIAlertView alloc]initWithTitle:@"提醒" message:string delegate:self cancelButtonTitle:@"知道了" otherButtonTitles:nil, nil];
//
// [view show];
//模态视图
self.sheet = [[UIActionSheet alloc]initWithTitle:@"ActionSheet" delegate:nil cancelButtonTitle:@"确认" destructiveButtonTitle:string otherButtonTitles:@"取消", nil];
[self.sheet showInView:self.view];
}
#pragma mark actionSheet delegate methods
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
switch (buttonIndex) {
case 0:
NSLog(@"case 0");
break;
case 1:
NSLog(@"case 1");
break;
default:
break;
}
}
但是执行之后发现还是不能调用。
2)原因是什么呢? 同第一个原因,还是我们的代理方法设置的位置不对,如果我们是临时起意来声明一个代理,一定要写在alloc之后,才能真正的设置代理
正确的代码如下:
//模态视图
self.sheet = [[UIActionSheet alloc]initWithTitle:@"ActionSheet" delegate:nil cancelButtonTitle:@"确认" destructiveButtonTitle:string otherButtonTitles:@"取消", nil];
self.sheet.delegate = self;
[self.sheet showInView:self.view];
//知识点:代理位置的设置:当我们设置代理的时候,一定要看准位置。只要我们的object初始化之后再设置代理。如果先设置代理,再初始化,那将把代理的属性也给抹掉。
综上所述,我们一定是先alloc,再进行属性的设置,要不然我们在alloc之前的任何操作都成为了野指针。