无法访问容器视图的 tableview 控制器元素

Posted

技术标签:

【中文标题】无法访问容器视图的 tableview 控制器元素【英文标题】:Not able to access container view's tableview controller elements 【发布时间】:2017-02-28 12:51:06 【问题描述】:

我有一个视图控制器 (vc1),它有一个容器视图,下面有一个保存按钮。容器视图嵌入到具有静态单元格的 tableview 控制器(tvc1)。每个单元格都有标签和文本字段。 我正在尝试在 vc1 中获取 tvc1 中文本字段的内容。 我尝试了两种方法:

为 vc1 中的 segue 做准备:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    NSLog(@"prepare for segue called in settings view controller.");
    NSString * segueName = segue.identifier;
    if ([segueName isEqualToString: @"embedseguesettings"]) 
        NSLog(@"embed segue called ");
        settingsTableViewController *tvc1 = (settingsTableViewController *)segue.destinationViewController;
        tvc1.surlTextField.text = @"i got u ";        
    

我正在打印“embed segue called”,但 tvc1 中的文本字段没有更新为我的文本“i got u”。我有正确的 tvc1 对象吗?

在vc1中实例化tvc1:

- (IBAction)save:(id)sender 
    settingsTableViewController *tvc1 = [self.storyboard instantiateViewControllerWithIdentifier:@"settingsTableView"];
    NSLog(@"surl textfeild = %@",tvc1.surlTextField.text);

但我总是得到 null 作为输出。我输入一些文本到 surl 文本字段,然后按保存。我总是得到空值。

settingsTableViewController 是容器视图的表视图控制器,我只设置了该类中的节数和行数。我是否需要使单元格出列,我不应该? ,它是一个静态表格视图。

【问题讨论】:

【参考方案1】:

问题是您在视图加载之前在 tvc1 中设置 textField 值。

你应该在 tvc1 中添加一个属性…

@property (nonatomic, strong) NSString* someText;

然后在您的 prepareForSegue 方法中,分配给 someText保留对 tvc1 的引用

if ([segueName isEqualToString: @"embedseguesettings"]) 
    settingsTableViewController *tvc1 = (settingsTableViewController *)segue.destinationViewController;
    tvc1.someText = @"i got u ";   
    self.tvc1 = tvc1     

在你的 tvc1 viewDidLoad

tvc1.surlTextField.text = self.someText

然后在你的保存方法中:

- (IBAction)save:(id)sender 
    // Don't instantiate a new tvc1
    NSLog(@"surl textfeild = %@",self.tvc1.someText);

【讨论】:

完美。非常感谢。 但是对于第二种方法,当我尝试通过情节提要实例化 tvc1 时,此时 tvc1 已经显示并已加载。为什么它不显示文本字段? 当您实例化视图控制器时,它会创建该类的一个新实例——而不是您更新的那个【参考方案2】:

根据- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 流它仍然没有分配它的出口所以......

此时未加载UIViewController。 您需要设置 @property 值并在 viewDidLoad() 方法中访问它 并相应地设置您的 textFiled 文本。

【讨论】:

以上是关于无法访问容器视图的 tableview 控制器元素的主要内容,如果未能解决你的问题,请参考以下文章

在主视图控制器的子容器视图中获取 tableView 的引用

在主视图控制器的子容器视图中获取tableView的引用

提供容器的摘要,如带有旁白的 tableview

容器视图中的 Tableview 溢出问题

tableView.reloadData() 和 DispatchQueue 无法在不同的视图控制器中重新加载 tableview

如何在 Swift 2 中使用 TableView 项目访问视图控制器?