UILabel文本没有改变,但xx.title正在工作

时间:2013-01-21 08:59:35

标签: objective-c ios6 uilabel uinavigationbar

我有两个视图控制器。在第一个视图控制器中,我有名单。当我点击它时,我希望在第二个视图控制器中显示相同的名称。

我的代码如下。

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // PropDetailViewController is second view controller
    PropDetailViewController *prop = [self.storyboard instantiateViewControllerWithIdentifier:@"prop"];

    ListOfProperty *propList = [propListFinal objectAtIndex:indexPath.row];

    NSString *myText = [NSString stringWithFormat:@"%@", propList.addressOfFlat];
    prop.detailLabel.text = myText;
    prop.title  = myText;

    [self.navigationController pushViewController:prop animated:YES];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

PropDetailViewController中,我有@property (retain, nonatomic) IBOutlet UILabel *detailLabel;

我期待的是当我点击说Name 1时,我会在UILabel和UINavigationBar中看到Name 1作为文本。但是我只在导航栏上看到Name 1而在UILabel上看不到。

2 个答案:

答案 0 :(得分:4)

不建议在程序流程中的那一点访问UIView项目。设置prop.detailLabel.text的值时,可能尚未加载视图。稍后加载视图时,将使用IB中XIB文件中给出的默认设置更新UIView。

你应该设置NSString属性,比如说

@property (retain, nonatomic) NSString *propName;

在按下视图控制器之前分配它。但是使用此属性而不是UILable。在viewDidLoad的PropDetailViewController中执行以下操作:

(void) viewDidLoad {
  // call super viewDidLoad and all the works ...

  self.detailLabel.text = propName;

} 

您可以使用viewWillAppear代替viewDidLoad。因为在分配属性的值时可以执行viewDidLoad。

如果您想要保存,那么请发明一个新的init方法,您可以在其中移交要预先设置的所有值。 但是我从来没有把它与故事板结合起来(你可以使用实例化而不是初始化......)因此我无法提出任何建议。

另一种干净的方法是坚持使用propName属性,但要实现自定义setter -(void)setPropName:(NSString)propName;,您可以在其中设置属性(如果自动合成,可能是_propName)并设置UILable文本并在viewDidLoad中设置UILable文本。

答案 1 :(得分:1)

试试这个: 在.h

@property (retain, nonatomic) NSString *detailText;
PropDetailViewController.m

中的

使用

更改代码行
 NSString *myText = [NSString stringWithFormat:@"%@", propList.addressOfFlat];
    prop.detailText = myText;
    prop.title  = myText;
ViewDidLoad中的

[self.detailLabel setText:self.detailText];