如何访问另一个控制器/视图 (iOS)
我有三个独立的类,UIViewController (A) 和两个 UITableViewController(B 和 C)。
我将表 B 和 C 添加到 A 中。
[A.view addSubview:B.tableView];
[A.view addSubview:C.tableView];
现在我需要通过在另一个表中进行选择来更改/重新加载一个表。例如,在B中选择“肉”则C变为“鸡肉、猪肉……”,选择“水果”则得到“苹果、西红柿……”。
我的问题通常是如何访问另一个控制器/视图。我应该在B中的didSelectRowAtIndexPath中写什么来访问另一个控制器(A,C)?
I have three separated class, UIViewController (A) and two UITableViewControllers (B and C).
I add table B and C into A.
[A.view addSubview:B.tableView];
[A.view addSubview:C.tableView];
Now I need to change/reload one table by the selection in another table. For example, select "meat" in B then C become "chicken, pork...", select "fruit" then get "apple, tomato...".
My question is generally Howto get access to another controller/view. What should I write in didSelectRowAtIndexPath in B to access another controller (A, C)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您正在寻找委托。给B和C添加一个协议,让对方实现。
我很久以前写了一个示例代码。
在那里,CheckTableController 可以通知 ShowFavoritesTableController,因为第二个控制器实现了第一个控制器的委托协议。
You are looking for delegation. Add a protocol to B and C and let the other implement it.
I wrote a sample code quite along time ago.
In there the CheckTableController can inform the ShowFavoritesTableController, as the second implements the delegate protocol of the first.
我通常通过 NSNotificationCenter 来完成此操作。在
使用NotificationCenter广播一条消息。
在具有接收端的类上,将其设置为在 viewDidLoad 或 init 方法中侦听此通知 在
.m 文件中声明您的方法 请
记住,当在 dealloc 方法中销毁对象时,删除观察者
如果您使用 ARC
如果您不使用 ARC 请记住超级
I usually do this through the NSNotificationCenter. In the
broadcast a message using NotificationCenter.
On the class that has the receiving end set it to listen for this notification in the viewDidLoad or init method
Have your method declared in the .m file
Remember to remove the observer when the object is destroyed in the dealloc method
If you're using ARC
If you're not using ARC remember to super
我认为最好的方法是,不使用三个单独的控制器,而只使用一个。这个控制器将是
UIViewController
的子类,其.h
文件应如下所示:现在,在您的
.m
文件中,像这样设置表格:然后,实现所需的
UITableViewDataSource
方法,如下所示:最后,在
didSelectRowAtIndexPath
中:这种方法确保您的控制器获得正确的
-viewDidLoad< /代码>,
-viewWillAppear
等,自动进行。请记住,仅将视图控制器的视图添加为子视图意味着您的控制器将不会收到这些调用。I think the best way to do this is, instead of using three separate controllers, just to use one. This one controller will be a subclass of
UIViewController
, and its.h
file should look something like this:Now, in your
.m
file, set the tables up like so:Then, implement desired
UITableViewDataSource
methods like so:Finally, in
didSelectRowAtIndexPath
:This approach ensures that your controller gets the right
-viewDidLoad
,-viewWillAppear
, and so on, automatically. Remember, just adding view controller's views as subviews means that your controller will not receive these calls.