2016-01-20 50 views
0

我真的無法理解爲什麼這種方式無法正常工作。 我有一個TableViewController與動態原型。我在一個名爲「InfoCell」的原型中放置了4個標籤,並給了它們一些限制。 如果我運行下面的cellForRowAtIndexPath應用:使用viewWithTag獲取UITableviewCell中的標籤時約束不起作用

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellIdentifier = @"InfoCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    return cell; 
} 

我所得到的是這樣的。 Everything looks fine 'til now

我這樣做只是爲了檢查標籤是否顯示在正確的位置。該頁面應該顯示2個單元格,所以一切看起來都很好。

現在,當我嘗試獲取對標籤的引用以更改文本時,問題就開始了。即使沒有實際更改文字,如果我的代碼如下所示:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellIdentifier = @"InfoCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    UILabel *nameLabel = (UILabel *)[cell viewWithTag:10]; 
    UILabel *surnameLabel = (UILabel *)[cell viewWithTag:20]; 
    UILabel *roleLabel = (UILabel *)[cell viewWithTag:30]; 
    UILabel *spouseNameLabel = (UILabel *)[cell viewWithTag:40]; 

    [cell addSubview:nameLabel]; 
    [cell addSubview:surnameLabel]; 
    [cell addSubview:roleLabel]; 
    [cell addSubview:spouseNameLabel]; 

    return cell; 
} 

我明白了。 Labels' positions went nuts

我試過了,例如,改變每個標籤的編程框架,

nameLabel.frame = CGRectMake(15.0, 50.0, 120.0, 20.0) 

,但它只是沒有做任何事情,我想是因爲自動佈局啓用了...但我在項目中太遠以禁用自動佈局。另外,我已經看到了viewWithTag的用法,就像我上面寫的一樣,不需要以編程方式重新定位標籤,所以它讓我不知道那裏真的發生了什麼!

+3

爲什麼你再次添加到單元格? –

+0

問題是沒有得到參考,問題是再次添加它們可能會破壞它們的約束。 – luk2302

+0

上帝。我知道HAD是愚蠢的。我覺得很愚蠢,我在這上面花了太多時間。 – Fraje90

回答

0

請記住,當您有任何UI對象添加了constraints時,您不能通過更改其對象CGRect來更改該對象的框架。實際上,您應該更改其constraint值。 現在在你的代碼中的問題是,

[cell addSubview:nameLabel]; 
[cell addSubview:surnameLabel]; 
[cell addSubview:roleLabel]; 
[cell addSubview:spouseNameLabel]; 

4行以上。當您在故事板中添加UILabel時,爲什麼要使用addSubview方法再次添加它們?刪除以上4行,並在UILabel上設置文本,您已經有一個參考,您正在使用它們的tag值訪問。所以你的方法應該如下所示。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellIdentifier = @"InfoCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    UILabel *nameLabel = (UILabel *)[cell viewWithTag:10]; 
    UILabel *surnameLabel = (UILabel *)[cell viewWithTag:20]; 
    UILabel *roleLabel = (UILabel *)[cell viewWithTag:30]; 
    UILabel *spouseNameLabel = (UILabel *)[cell viewWithTag:40]; 

    nameLabel.text = @""; 
    surnameLabel.text = @""; 
    roleLabel.text = @""; 
    spouseNameLabel.text = @""; 

    return cell; 
}