viewDidLoad:检查是否来自segue?

时间:2013-06-27 22:03:07

标签: ios objective-c delegates storyboard segue

好的,基本上我有一个主视图控制器 - 我的应用程序的主菜单。我有一个按钮,将用户带到表视图,在那里他们选择需要应用于主视图的东西。问题是,我不知道如何判断主视图控制器是从segue还是从应用程序的开头创建的。有没有办法检查这个?我应该为viewDidLoad方法设置一个布尔值或字符串来检查,然后在prepareForSegue中修改它吗?

2 个答案:

答案 0 :(得分:3)

现在,在我能给你一个更全面的答案之后,我会更好地理解你的意思。您真正需要的是与委托和协议相关的模式。这是一种在viewControllers之间发送数据的方法,无需知道有关父(或委托)控制器的任何真实细节。这就是你想要做的。

为了清楚起见,我将使用两个名称作为控制器,mainViewController作为根控制器,tableViewController作为UITableViewController子类的实例。

.h中。您想要设置协议的tableViewController

@protocol SingleSelectionDelegate
- (void)selectionHasBeenChosenWithOption:(NSString *)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

然后在您.m的{​​{1}}(或.h)中,您需要添加以下内容:

mainViewController

然后,当您拥有selectionDelegate的信息时,最后一步是调用委托方法。这是在// 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)selectionHasBeenChosenWithOption:(NSString *)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)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)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 的{​​{1}}中完成的。在这种情况下,我将在tableViewController

中执行此操作
.m

所以这基本上就是你所追求的。我在文本编辑器中输入了几乎所有这些,因此可能会出现一些语法错误。让我知道,我可以解决它们。这是一个经过深思熟虑的iOS开发概念,因为您最终会在整个地方使用它。学得很好,你也可以在上面找一些其他的教程。就像我说的,你会发现它们很多!我记得当我第一次学习它时,我感到压力很大,但现在它只是第二天性。

答案 1 :(得分:1)

你也可以查看[UIApplication sharedApplication] delegate] window] rootViewController],但我可能会选择一个属性。