【问题标题】:UILabel, UITextView etc.. work only in ViewWillAppear and ViewDidLoad, and don't change dynamicallyUILabel、UITextView 等.. 仅在 ViewWillAppear 和 ViewDidLoad 中有效,不会动态更改
【发布时间】:2012-04-03 20:38:12
【问题描述】:

我有一个问题,我想设置 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 视图,我按下一行,然后调用新视图并传递属性。

【问题讨论】:

  • 发布更多代码...为您提供的第一个函数提供完整代码..以及何时调用..
  • 我已经编辑...但是 NSLog 工作,所以我不明白为什么不更改标签中的文本...如果我这样做:mySerialTitle.text = @"再见”;在配置视图方法或 setDetailItem 方法中,不要更改文本...我要疯了
  • 添加断点并检查是否实际调用了配置视图......你也能告诉你什么时候调用第一个函数..给出你调用它的代码..发布那个函数太..
  • 是的,进入配置方法,我很难过 NSLog 工作并在控制台中显示我的字符串,还有断点工作,所有工作,但 IBOutlets 不工作......工作仅在 viewdidload 和 viewwillappear 中出现
  • 我已经按照你的要求编辑了通话功​​能

标签: ios cocoa-touch text uilabel iboutlet


【解决方案1】:

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?

【讨论】:

  • 我知道何时调用 viewdidload 和 viewwillappear,我的问题是我无法在我的代码中设置我的 uilabel 的文本,并且只能在 viewwillappear 和 viewdidload 方法中使用,
  • 我写了Console Log,好像是viewdidload的第一个调用,是不是有问题?
  • 如果您的代码首先被调用,然后 viewDidLoad 被调用(之后),那么是的,这是一个问题。在加载视图之前,您无法对其进行操作。
  • 是的,这就是问题所在,那么我如何使用 setDetailitem 方法将属性传递给另一个视图?
  • 我在你的选项中附加了答案。
【解决方案2】:
- (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];

如果您在此之前调用它..那么您的视图没有正确加载并且将文本设置为标签将不起作用..

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    相关资源
    最近更新 更多