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