好的,所以基本上我有一个主视图 Controller - 我的应用程序的主菜单。我有一个按钮,可以将用户带到表格 View ,他们可以在其中选择需要应用于主视图的内容。问题是,我不知道如何判断主视图 Controller 是从 segue 还是从应用程序开始创建的。有没有办法检查这个?我应该只为 viewDidLoad 方法设置一个 bool 值或字符串来检查,然后在 prepareForSegue 中修改它吗?
Best Answer-推荐答案 strong>
所以现在我可以更好地了解你是什么之后我可以给你一个更彻底的答案。您真正要寻找的是与委托(delegate)和协议(protocol)相关的模式。这是一种在 viewController 之间发送数据的方式,无需了解父(或委托(delegate)) Controller 的任何真实细节。这就是你想要做的。
为了清楚起见,我将为您的 Controller 使用两个名称,mainViewController 用于您的根 Controller ,tableViewController 用于您的 UITableViewController 子类的实例。
在 .h 中。你的 tableViewController 你会想要设置一个协议(protocol):
@protocol SingleSelectionDelegate
- (void)selectionHasBeenChosenWithOptionNSString *)selection;
@end
@interface MyTableViewControllerSubclass : UITableViewController
// properties and method declarations
// this is your property you will use to send data back to your delegate (in this case your mainViewController)
@property (weak, nonatomic) id<SingleSelectionDelegate> selectionDelegate;
@end
然后在 mainViewController 的 .m (或 .h )中,您需要添加:
// this imports the interface and also the protocol that you want
#import "MyTableViewControllerSubclass.h"
// the <Single...> part says you conform to this protocol and implement the methods it requires (in this case selectionHasBeenChosenWithOption
@interface MainViewController <SingleSelectionDelegate>
@end
@implementation MainViewController
// here is where you need to implement the required method
- (void)selectionHasBeenChosenWithOptionNSString *)selection {
// do what you want with the selection, assign it to a property, call other methods, pass it to other delegates, or whatever else.
// now that you have your information you want the focus to come back to you so you
[self.navigationController popToViewController:self animated:YES]; // works even if not the root
}
// you also need to set yourself as tableViewController's selectionDelegate, if you are using Storyboards you will do this in the prepareForSegue.
- (void)prepareForSegueUIStoryboardSegue *)segue senderid)sender {
if ([segue.destinationViewController isKindOfClass:[MyTableViewControllerSubclass class]]) {
// you could also check a specific segue's identifier but this makes sense because if it is this subclass then it will have a selectionDelegate property
// assign yourself as the delegate
MyTableViewControllerSubclass *destination = (MyTableViewControllerSubclass *)segue.destinationViewController
destination.selectionDelegate = self;
}
@end
最后一步是在您获得 selectionDelegate 的信息时调用委托(delegate)方法。这是在您的 tableViewController 的 .m 中完成的。在这种情况下,我将在 tableView:didSelectRowAtIndexPath: 中进行
- (void)tableViewUITableView *)tableView didSelectRowAtIndexPathNSIndexPath *)indexPath {
// getting the data you want to send back
NSString dataToSendBack = [self.myArray[indexPath.row] description];
// sending the data to your delegate (in this case mainViewController)
[self.selectionDelegate selectionHasBeenChosenWithOption:dataToSendBack];
// mainViewController is handling the popping so we do not need to do anything with the navigation stack
}
所以这基本上就是你所追求的。我在这里的文本编辑器中输入了几乎所有这些内容,因此可能存在一些语法错误。让我知道,我可以修复它们。这是 iOS 开发的一个重要概念,因为您最终会在所有地方使用它。学好它,你也可以寻找一些其他的教程。就像我说的,你会发现很多!我记得当我第一次学习它时,我自己感到不知所措,但现在它只是第二天性。
关于ios - viewDidLoad : Checking if from a segue?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/17353984/
|