2012-03-19 54 views
0

我有一个问题,我想设置UILabel或UItextView或另一个IBOUTLET对象的文本,但我只能在viewwillappear和viewdidload方法,如果我在代码中的另一种方法中设置文本不会改变什么,这里是一个例子:UILabel,UITextView等..只能在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的工作,我可以看到我的字符串中的控制台,但在视图中的文本不换,而不是如果我在ViewWillApp设定一个简单的文本耳朵或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视图我按下上的行,然后调用新的视图,并通过该属性。

+0

发布更多的代码...给你的第一个功能的整个代码..当这被称为.. – Shubhank 2012-03-19 11:04:59

+0

我已编辑...但NSLog的工作,所以我不明白为什么不改变标签中的文本...如果我这样做:mySerialTitle.text = @“CIAO”;在配置视图方法或setDetailItem方法中,不要更改文本...我要疯了 – Piero 2012-03-19 11:21:27

+0

添加断点并检查配置视图是否实际调用或不...您是否也可以告诉您何时调用第一个功能..给你从哪里调用它的代码..post该功能太.. – Shubhank 2012-03-19 11:29:54

回答

0

viewDidLoad在视图加载到内存后调用。请参阅苹果文档中的viewDidLoad。在视图加载到内存中并且在它出现之前,viewWillAppear被调用。

在加载视图之前,您无法更改该视图的属性。因此,请检查您的代码路径(甚至可能注销这些方法以及viewDidLoad和viewWillAppear方法),然后查看是否在调用viewDidLoad之前设置了这些属性(日志输出可以很容易地看到)。

从viewDidLoad中文档:

视图控制器加载其视图 层级到存储器后,此方法被调用。不管 视图层次结构是从nib文件加载还是以编程方式在loadView方法中创建 ,都会调用此方法。通常,您可以重写此方法,以对从nib文件加载的视图执行附加初始化操作 。

您所添加的日志语句清楚地表明您在加载之前操作视图。正如你所看到的,setDetail在viewDidLoad之前被调用。

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?

+0

我知道何时调用viewdidload和viewwillappear,我的问题是我无法在我的代码中设置我的uilabel的文本,并且只能在viewwillappear和viewdidload方法中使用 – Piero 2012-03-19 11:41:16

+0

“在我的代码中”在调用viewDidLoad之前? – bryanmac 2012-03-19 11:42:42

+0

我已经写了控制台日志,似乎它被称为第一个viewdidload,它存在的问题? – Piero 2012-03-19 11:57:18

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

    } 
} 

上述功能,无论你在呼唤它form..i不知道..确保你叫它后

[self.navigationController pushViewController:self.searchResultViewController animated:YES]; 

,如果你在此之前叫它..然后你的看法没有正确加载和设置文本标签将无法正常工作..

相关问题