Ios 子容器视图中的UILabel未更新
我正在构建一个iPad应用程序,在其中我将使用容器视图 我使用故事板,因此添加了2个Ios 子容器视图中的UILabel未更新,ios,objective-c,uiviewcontroller,Ios,Objective C,Uiviewcontroller,我正在构建一个iPad应用程序,在其中我将使用容器视图 我使用故事板,因此添加了2个uiviewcontroller和1个UITableViewController 在一个UIViewController中,我添加了两个容器视图,并通过嵌入段将每个视图连接到UITableViewController和另一个UIViewController 两个容器视图在应用程序启动时都可见 我用数组填充了tableview,并试图通过didselectrowatindexpath将字符串传递给另一个UIView
uiviewcontroller
和1个UITableViewController
在一个UIViewController
中,我添加了两个容器视图,并通过嵌入段将每个视图连接到UITableViewController
和另一个UIViewController
两个容器视图在应用程序启动时都可见
我用数组填充了tableview,并试图通过didselectrowatindexpath
将字符串传递给另一个UIViewController
我可以看到字符串通过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];
}
@synthesize webAddress, webview, webURL;
-(void)viewWillAppear:(BOOL)animated
{
self.webAddress = webAddress;
webURL.text = webAddress;
NSLog(@"%@",webAddress);
NSLog(@"%@", webURL.text);
[super viewWillAppear:animated];
}
下面是接收视图控制器的m文件:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailVC *detailVC = [[DetailVC alloc] init];
NSString *urlString = [siteAddresses objectAtIndex:indexPath.row];
detailVC.webAddress = urlString;
[detailVC viewWillAppear:YES];
}
@synthesize webAddress, webview, webURL;
-(void)viewWillAppear:(BOOL)animated
{
self.webAddress = webAddress;
webURL.text = webAddress;
NSLog(@"%@",webAddress);
NSLog(@"%@", webURL.text);
[super viewWillAppear:animated];
}
所有插座和连接都正确,但标签文本仍然不变
我使用故事板通过嵌入序列将容器视图连接到控制器
非常感谢您的帮助。您正在使用
alloc init
创建一个新的详细视图。相反,您应该参考现有的详细信息视图,例如通过parentViewController
正如其他海报所指出的,您正在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;
}
(显然,您需要在序列上设置有意义的标识符的故事板,并更改上面的代码以匹配。)
那么您的didSelectRowatineXpath方法可能如下所示:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.detailVC updateWebAddressWithString: urlString];
}
请注意,您不应该直接调用VC的ViewWillDisplay:animated方法
相反,请编写一个方法updateWebAddressWithString,该方法接受一个新的url字符串,将其传递给web视图,然后触发一个更新。我猜您实际上并没有更新标签。有许多不同的可能性可以解释为什么会发生这种情况,但最明显的是
webURL
是一个空指针。您似乎在didSelect…
上分配了一个新的控制器,而不是在childController上设置属性(您可以通过父控制器的childViewControllers
属性获取对嵌入式控制器的引用)。如何通过parentViewController引用详细视图?为容器控制器提供一个包含详细视图控制器的@属性
。然后使用self.parentViewController.detailViewController
。表视图控制器实际上是一个子视图控制器,而详细视图控制器也是一个子视图控制器r、 因此,在DidSelectRowatingIndexPath中添加[self.detailVC…]将无法工作?如何从tableviewcontroller访问详细信息子视图控制器?谢谢