【问题标题】:Loading tableview from another class in iPhone从 iPhone 中的另一个类加载 tableview
【发布时间】:2009-10-15 01:44:13
【问题描述】:

我有一个 RootViewController 类和一个 UserSettingsController 类。我在 RootViewController 类中定义了 UITableView 方法(numberOfRowsInSection、cellForRowAtIndexPath)。

我想从 UserSettingsController 类重新加载 RootViewController 类中定义的表视图。如何从 UserSettingsController 类控制 RootViewController 类中的 tableView 对象?

我尝试了以下方法,但它尝试加载一个新的 tableview 对象。

RootViewController *rootViewController = [[RootViewController alloc]init]; 
[rootViewController.mytableView reloadData];
[rootViewController autorelease];

【问题讨论】:

  • 你正在尝试做的事情听起来非常奇怪。如果您解释原因,也许会更容易回答。

标签: iphone objective-c xcode


【解决方案1】:

您可以在 RootViewController 本身的 viewWillAppear 方法中重新加载 rootViewController.mytableView。这将使rootViewController.mytableView 在您即将进入 rootViewController 视图时重新加载。如果您要加载的数据不多(例如从网络上获取数据需要更多时间来加载),那么您可以使用此解决方案。

否则,要从你的设置视图加载rootViewController.mytableView,你可以像这样使用NSNotification:

在 RootViewController.m 中:

//This goes in viewDidLoad
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTableViewData) name:@"ReloadRootViewControllerTable" object:nil];

Then make a method like this:
-(void) reloadTableViewData{

   [mytableView reloadData];
}

在设置视图中,您要重新加载 RootViewController tableView,这样写:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ReloadRootViewControllerTable" object:nil];

这将自动调用 RootViewController 的 reloadTableViewData 方法,而无需进行子类化或任何操作。 :)

利用自定义名称的通知来调用其他类中的静态方法。它们非常方便。

【讨论】:

  • Chintan:感谢您的建议。我还研究了异步事件和通知,并且该策略奏效了。我还测试了另一种方法,我们将表对象存储在应用程序委托中,并从任何其他类对该表对象使用 reload 方法。这也对我有用。
  • 感谢您接受我的回答。是的,在应用程序委托中获取对象将始终有效,但我不鼓励您再使用一个全局变量。如果您的程序变得足够大,您最终将在应用程序委托中拥有大约 80-100 个变量,这将使其难以维护、调试或扩展。所以我建议将 RootViewController 的 tableView 保留在 RootViewController 本身而不是全球化它。
  • 感谢这对我帮助很大,我试图从主视图更新 splitview 控制器的详细表视图,但没有任何效果,除了这个!
【解决方案2】:

我假设您想要做的是在两个不同的视图控制器中显示相同的确切表格。

将 myTableView 设为全局或单例,并将其作为属性在 rootViewController 和 userSettingsController 之间共享。更好的是,做更多的工作并为您的 myTableView 创建一个类,这样您就可以更轻松地设置和操作它,而不必在视图控制器的实现中传播重复的代码。

在每个视图控制器中,测试以查看if (myTableVIew == nil),如果是,请继续初始化并设置它(最好通过您创建的 tableview 类)。设置后,您需要确保将 myTableView 添加到两个视图控制器的属性(保留)中。然后要在每个控制器中显示此 tableView,您只需执行 [self.view addSubview:myTableView]; 其中 self 是当时处于活动状态的视图控制器。

【讨论】:

  • 我认为他只想调用 RootViewController 的 reloadData 而不是在其他视图中显示相同的 tableView。
【解决方案3】:

是的 mahboudz,你说的绝对正确,tableview 的值应该是 nil

因为如果使用 init 从另一个类重新初始化该类,则对象将重置为先前设置的 nil。

而且当你想重新加载它时它不起作用,因为 tableview 的值为 nil

我没有得到更好的答案来解决这个问题,如果有朋友知道解决方案,请告诉我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2022-01-05
    相关资源
    最近更新 更多