子容器视图中的UILabel未更新

时间:2014-05-10 21:09:38

标签: ios objective-c uiviewcontroller

我正在构建一个iPad应用程序,我将使用容器视图。

我使用了故事板,因此我添加了2 UIViewControllers和1 UITableViewController

在一个UIViewController中,我添加了2个容器视图,并通过嵌入segue将每个视图连接到UITableViewController和另一个UIViewController

两个容器视图在app start上都可见。

我使用数组填充了tableview,我正在尝试将字符串传递给另一个UIViewControllerdidselectrowatindexpath

我可以看到字符串由nslogging传递给viewcontroller,但视图控制器中的标签不会改变。

这是tableviewcontroller中的didselectrowatindexpath:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailVC *detailVC = [[DetailVC alloc] init];
    NSString *urlString = [siteAddresses objectAtIndex:indexPath.row];
    detailVC.webAddress = urlString;

    [detailVC viewWillAppear:YES];
}

,这是接收视图控制器的m文件:

@synthesize webAddress, webview, webURL;

-(void)viewWillAppear:(BOOL)animated
{

    self.webAddress = webAddress;
    webURL.text = webAddress;
    NSLog(@"%@",webAddress);
    NSLog(@"%@", webURL.text);
    [super viewWillAppear:animated];
}

所有插座和连接都是正确的,但标签文字仍然没有改变。

我正在使用storyboard通过嵌入segues将容器视图连接到控制器。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您正在使用alloc init创建新的详细信息视图。相反,您应该参考现有的详细信息视图,例如通过parentViewController

答案 1 :(得分:1)

正如其他海报所指出的那样,你在didSelectRowAtIndexPath中创建了一个新的视图控制器实例,这是错误的。

您要做的是编写prepareForSegue,以便检查每个嵌入segue的segue标识符,并保存指向稍后需要引用的每个视图子视图控制器的指针:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
  if ([segue.identifier isEqualToString: @"detailVC"]
    self.detailVC = segue.destinationViewController;
  else if ([segue.identifier isEqualToString: @"childVC2"]
    self.childVC2 = segue.destinationViewController;
  else if ([segue.identifier isEqualToString: @"childTableVC"]
    self.childTableVC = segue.destinationViewController;
}

(显然,您需要在segue上设置包含有意义标识符的故事板,并更改上面的代码以匹配。)

然后你的didSelectRowAtIndexPath方法可能如下所示:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.detailVC updateWebAddressWithString: urlString];
}

请注意,您不应直接调用VC的viewWillAppear:动画方法。

相反,编写一个方法updateWebAddressWithString,它接受一个新的url字符串,将其传递给Web视图,然后触发更新。