子容器视图中的 UILabel 未更新

Posted

技术标签:

【中文标题】子容器视图中的 UILabel 未更新【英文标题】:UILabel in child container view not updating 【发布时间】:2014-05-10 21:09:37 【问题描述】:

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

我使用故事板,所以我添加了 2 个UIViewControllers 和 1 个UITableViewController

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

两个容器视图在应用启动时都可见。

我用一个数组填充了 tableview,我试图通过didselectrowatindexpath 将一个字符串传递给另一个UIViewController

我可以看到字符串通过 nslogging 传递给视图控制器,但视图控制器中的标签没有改变。

这是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];

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

我正在使用故事板通过嵌入 segue 将容器视图连接到控制器。

非常感谢任何帮助。

【问题讨论】:

我猜你实际上并没有更新标签。为什么会发生这种情况有很多不同的可能性,但最明显的是webURL 是一个空指针。 您似乎在 didSelect... 上分配了一个新控制器,而不是在 childController 上设置属性(您可以通过父控制器的 childViewControllers 属性获取对嵌入式控制器的引用)。 【参考方案1】:

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

【讨论】:

如何通过 parentViewController 引用详细视图? 给你的容器控制器一个 @property 来保存细节视图控制器。然后使用self.parentViewController.detailViewController【参考方案2】:

正如其他发帖者所指出的,您正在 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;

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

那么您的 didSelectRowAtIndexPath 方法可能如下所示:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    [self.detailVC updateWebAddressWithString: urlString];

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

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

【讨论】:

table view controller其实是一个child view controller,detail view controller也是一个child view controller,所以在didselectrowatindexpath里面加上[self.detailVC...]不行吗?如何从 tableviewcontroller 访问详细子视图控制器?谢谢

以上是关于子容器视图中的 UILabel 未更新的主要内容,如果未能解决你的问题,请参考以下文章

有背景颜色换行 UILabel [重复]

没有子视图时更新uilabel的宽度

添加子视图后,UITableViewCell contentView 框架大小会自动增加吗

更改 TableViewController 中的 UILabel Y 位置

Snapkit 和 UILabel 的轮换

自定义 UILabel 视图未在 Interface Builder 中更新其框架