[课堂实践与项目]代理位置的恰当设置和代理不调用的原因分析

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];

}

我们的sheet代理方法如下:
#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之前的任何操作都成为了野指针。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值