子容器视图中的 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 未更新的主要内容,如果未能解决你的问题,请参考以下文章
添加子视图后,UITableViewCell contentView 框架大小会自动增加吗