UILabel,UITextView等仅适用于ViewWillAppear和ViewDidLoad,并且不会动态更改

时间:2012-03-19 10:52:31

标签: ios cocoa-touch text uilabel iboutlet

我有一个问题,我想要设置UILabel或UItextView或其他IBOUTLET对象的文本,但我只能在viewwillappear和viewdidload方法中执行此操作,如果我在代码中的另一个方法中设置文本不会改变任何内容,这是一个例子:

我有一个从另一个类中检索字符串的方法,然后我想在我的uilabel中设置这个字符串:

- (void)setDetailItem:(id)newDetailItem
{

if (detailItem != newDetailItem) {
    NSLog(@"SetDetailItem");
    [detailItem release]; 
    detailItem = [newDetailItem retain]; 
    detailString = [[FindStringClass alloc] init];
    // Update the view.

    detailItem = [detailString searchStringFor:detailItem.name];

    if (detailItem) {
        //
        NSLog(@"setDetail: %@",detailItem.stringName);
        [self configureView];
    }

  }
 }

  - (void)configureView {

NSLog(@"configure view: %@",detailItem.stringName);
mySerialTitle.text = detailItem.stringName;
}

NSLog的工作,我可以在控制台中看到我的字符串,但是视图中的文本不会改变,相反如果我在ViewWillAppear或viewDidLoad方法中设置了一个简单的文本,那么与IBOOutlets的连接是正确的,像这样:

- (void)viewDidLoad
{
mySerialTitle.text = @"CIAO";
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}

这是调用函数,我从另一个视图调用setDeatItem:

  self.searchResultViewController.detailItem =    [myArray objectAtIndex:[indexPath row]];    
  [self.navigationController pushViewController:self.searchResultViewController animated:YES];

任何人都可以帮助我吗?

编辑: 这是调用该方法的NSLog:

2012-03-19 12:51:02.617 TestApp[292:b603] SetDetailItem
2012-03-19 12:51:06.161 TestApp[292:b603] setDetail: Chicken
2012-03-19 12:51:06.162 TestApp[292:b603] configure view: Chicken
2012-03-19 12:51:06.175 TestApp[292:b603] View DidLoad

我从Tableviewcontroller调用searchviewcontroller视图,然后按一行,然后调用新视图并传递属性。

2 个答案:

答案 0 :(得分:0)

在将视图加载到内存后调用viewDidLoad。请参阅Apple文档中的viewDidLoad。视图加载到内存后,在它出现之前,将调用viewWillAppear。

在加载视图之前,您无法更改视图的属性。因此,检查您的代码路径(甚至可能在这些方法和viewDidLoad和viewWillAppear方法中注销),看看您是否在调用viewDidLoad之前设置了这些属性(日志输出将使其易于查看)。

来自viewDidLoad docs:

  

在视图控制器加载其视图后调用此方法   层次结构到内存。无论是否调用此方法   视图层次结构是从nib文件加载或以编程方式创建的   在loadView方法中。您通常会覆盖此方法以执行   对从nib文件加载的视图进行额外的初始化。

您添加的日志语句清楚地表明您在加载视图之前对其进行操作。如您所见,在viewDidLoad之前调用setDetail。

2012-03-19 12:51:02.617 TestApp[292:b603] SetDetailItem
2012-03-19 12:51:06.161 TestApp[292:b603] setDetail: Chicken
2012-03-19 12:51:06.162 TestApp[292:b603] configure view: Chicken
2012-03-19 12:51:06.175 TestApp[292:b603] View DidLoad

如果你想在你正在推动的视图上设置数据,你有几个选择。

  1. 调用setDetail但在setDetail中只设置iVar数据 - 不要操纵视图。然后,在viewDidLoad / WillAppear中,读取iVar数据并操纵视图。

  2. 使用委托将视图推送回启动视图。请参阅What exactly does delegate do in xcode ios project?

答案 1 :(得分:0)

- (void)setDetailItem:(id)newDetailItem
{

if (detailItem != newDetailItem) {
    NSLog(@"SetDetailItem");
    [detailItem release]; 
    detailItem = [newDetailItem retain]; 
    detailString = [[FindStringClass alloc] init];
    // Update the view.

    detailItem = [detailString searchStringFor:detailItem.name];

    if (detailItem) {
        //
        NSLog(@"setDetail: %@",detailItem.stringName);
        [self configureView];
    }

  }
 }

以上功能无论你在哪里调用它形式..我都不知道..确保你在

之后调用它
  [self.navigationController pushViewController:self.searchResultViewController animated:YES];

如果您在此之前调用它..那么您的视图未正确加载,并且将文本设置为标签将无法正常工作..