ViewController 类在创建视图时创建新实例,但它应该使用现有的实例
Posted
技术标签:
【中文标题】ViewController 类在创建视图时创建新实例,但它应该使用现有的实例【英文标题】:ViewController class creates new instance when creating view, but it should use an existing one 【发布时间】:2012-10-02 01:46:28 【问题描述】:我正在一个名为 ResourcesTableViewController 的类中创建一个 TableViewController。我正在创建课程:
ViewController.h:
@interface ViewController : UIViewController
ResourcesTableViewController *resourceTableViewController;
ViewController.m:
resourceTableViewController = [[ResourcesTableViewController alloc] initWithStyle:UITableViewStylePlain];
[resourceTableViewController setTableViewObject:localObject];
现在我可以使用它,我可以打电话了
NSLog(@"%@ %@",resourceTableViewController,[resourceTableViewController tableViewObject]);
在我的 ViewController.m 中的几个部分(如预期)具有相同的输出
<ResourcesTableViewController: 0x749f1c0> tableViewObjectContent
。为了打开新的 TableView,我在情节提要中创建了一个带有弹出框到新视图的按钮(作为触发的 segue)。但是一旦按下按钮并出现视图,它就会创建一个新实例。奇怪的是,我放入了我的类 ResourcesTableViewController 的 viewDidLoad:
NSLog(@"viewDidLoad: %@: %@", self, self.tableViewObject);
它正在返回
<ResourcesTableViewController: 0x74bbcd0>: (null)
。另一个内存地址,另一个实例。不是我之前使用的实例,也绝对不是我给该 tableViewOject 的实例。 如何从属于我创建和使用的 resourceTableViewController 的实例调用视图?我仍然可以通过与对象 resourceTableViewController 通信来访问那个“旧”实例,但是创建的视图是另一种类型的视图,它肯定不会从我给第一个对象的对象中使用。
【问题讨论】:
您是否还在情节提要中创建了表格视图控制器? 是的,我做到了。我创建了一个表视图控制器并将其正确分配给我的类 ResourcesTableViewController。 我不能让这个视图成为某种静态的吗? 我认为您的问题是在代码和情节提要中创建控制器,这就是您获得 2 个不同实例的原因。在不了解您要做什么的情况下,我不确定如何解决它。例如,“打开新的 TableView”是什么意思? 我不认为我在代码和情节提要中都创建了控制器,我只是创建了类,然后在情节提要中创建了控制器并将其分配给类。所以我使用了“ResourcesTableViewController *resourceTableViewController;”在我的 ViewController.h 中访问这个故事板创建的表视图控制器。这不应该是这样吗? (是的,我是 XCode 的新手,正在编写我的第一个应用程序,但这已经是一篇学士论文,所以我需要完成这项工作。)您在我的问题上看到的更多代码让我想到了这个问题:***.com/questions/12675288 【参考方案1】:如何显示表格视图取决于您希望如何显示它,以及之前屏幕上的内容。通常,您会使用 segue 从当前控制器(您的按钮所在的控制器)转换到表格视图。为此,您可以使用 performSegueWithIdentifier:sender: 其中标识符参数是您在 IB 中为 segue 指定的名称。但是您可以通过控制从一个视图中的按钮拖动到表视图控制器的视图并为 segue 类型选择模态来完全不使用任何代码 - 然后,单击按钮将导致该表视图出现在屏幕上.
如果您使用情节提要,则根本不应该在代码中分配 init —— segue 会为您实例化新的视图控制器。
【讨论】:
是的,但这不是问题。新视图确实出现了,但它不是我在 ViewController.m 中创建和交流的那个。我喜欢你的动机,即我可以创建两个实例,这是正确的 - 我现在读到故事板在显示视图时会创建自己的实例。 我实际上是在尝试使用“UIStoryboard *storybord = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];”来访问这个实例和“resourcesTableViewController = [storybord instantiateViewControllerWithIdentifier:resourcesTableViewControllerID];”将 Table View Controller 的“Storyboard ID”设置为“resourcesTableViewControllerID”后。我现在仍然收到我正在尝试解决的错误“使用未声明的标识符'resourcesTableViewControllerID'”。 为什么要访问实例?我不知道你想用它做什么。你应该去掉实例化表格视图控制器的代码,你不需要它。 嗯,重点是我想创建一个具有指定行数的表格视图。我在主视图中处理 HTTP 请求/响应。当我收到响应时,我正在解析它以获取我存储在字典中的有效资源。之后,我想访问表视图实例并提供字典,以便在调用此特定实例时(通过按下按钮)可以访问该字典并可以创建具有适当数量的单元格的表并用字典填充它条目。 我忘记了@""... 所以正确的代码应该是: UIStoryboard *storybord = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; resourceTableViewController = [storybord instantiateViewControllerWithIdentifier:@"resourcesTableViewControllerID"];但它仍然创建新实例而不是访问现有实例。真令人气愤。 :-(以上是关于ViewController 类在创建视图时创建新实例,但它应该使用现有的实例的主要内容,如果未能解决你的问题,请参考以下文章
如何创建一个具有多个 ViewController 可以使用的关联视图类的 Nib
以编程方式创建 ViewController 时,如何将其视图设置为 SKVIew 类型?