我有一个问题,我想要设置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视图,然后按一行,然后调用新视图并传递属性。
答案 0 :(得分:0)
在加载视图之前,您无法更改视图的属性。因此,检查您的代码路径(甚至可能在这些方法和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
如果你想在你正在推动的视图上设置数据,你有几个选择。
调用setDetail但在setDetail中只设置iVar数据 - 不要操纵视图。然后,在viewDidLoad / WillAppear中,读取iVar数据并操纵视图。
使用委托将视图推送回启动视图。请参阅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];
如果您在此之前调用它..那么您的视图未正确加载,并且将文本设置为标签将无法正常工作..