无法访问容器视图的 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.reloadData() 和 DispatchQueue 无法在不同的视图控制器中重新加载 tableview