Ios viewDidLoad:检查是否从序列?

Ios viewDidLoad:检查是否从序列?,ios,objective-c,delegates,storyboard,segue,Ios,Objective C,Delegates,Storyboard,Segue,好的,基本上我有一个主视图控制器-我的应用程序的主菜单。我有一个按钮,将用户带到一个表视图,在那里他们选择需要应用于主视图的内容。问题是,我不知道如何判断主视图控制器是从segue还是从应用程序的开始创建的。有办法检查这个吗?我是否应该为viewDidLoad方法设置一个要检查的布尔值或字符串,然后在PrepareForsgue中修改它?您也可以检查[UIApplication sharedApplication]delegate]window]rootViewController],但我可能只

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

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

您也可以检查
[UIApplication sharedApplication]委派]窗口]根视图控制器]
,但我可能只会选择一个属性。

因此,现在我更好地了解了您是什么,然后我可以给您一个更全面的答案。您真正需要的是与委托和协议相关的模式。这是一种在ViewController之间发送数据的方法,无需了解有关父(或代理)控制器的任何实际详细信息。这就是你想要做的

为了清晰起见,我将为您的控制器使用两个名称,
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
然后,最后一步是在您有selectionDelegate信息时调用委托方法。这是在您的
tableViewController
.m
中完成的。在这种情况下,我将在
tableView:didselectrowatinexpath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)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开发来说,这是一个经过大量培训的概念,因为您最终将在各地使用它。学好它,你也可以找一些其他的教程。就像我说的,你会发现很多!我记得当我第一次学习它的时候,我感到很压抑,但现在它只是第二天性。

所以现在我更好地理解了你,然后我可以给你一个更彻底的答案。您真正需要的是与委托和协议相关的模式。这是一种在ViewController之间发送数据的方法,无需了解有关父(或代理)控制器的任何实际详细信息。这就是你想要做的

为了清晰起见,我将为您的控制器使用两个名称,
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
最后一步是在您有selectionDelegate的信息时调用delegate方法。这是在您的
tableViewController
.m
中完成的。在这种情况下,我将在
tableView:didselectrowatinexpath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)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开发来说,这是一个经过大量培训的概念,因为您最终将在各地使用它。学好它,你也可以找一些其他的教程。就像我说的,你会发现很多!我记得当我第一次学习它的时候,我感到很压抑,但现在它只是我的第二天性。

所以为了验证,你想去你的
mainViewController
tableController
,然后回到你原来的
mainViewController
,对吗?如果是这样的话,你会1。不想创建一个新的
mainViewController
返回到它2。调查学员/协议。关于这一点有很多信息,这就是你想要的。是的,但整个过程都封装在一个导航控制器中。通过切换回主视图。我如何知道它是否正在创建一个新视图,如果是,是否有办法“切换”回主根视图并将数据带到我身边?我知道
poptrootviewcontrolleranimated:
可以到达堆栈底部,但我不知道如何将数据带到堆栈底部?因此,为了验证,您希望转到
mainViewController
tableController
,然后返回到原始
mainViewController
,对吗?如果是这样的话,你会1。不想创建一个新的
mainViewController
返回到它2。调查学员/协议。关于这一点有很多信息,这就是你想要的。是的,但整个过程都封装在一个导航控制器中。通过切换回主视图。我如何知道它是否正在创建一个新视图,如果是,是否有办法“切换”回主根视图并将数据带到我身边?我知道
popToRootViewControllerAnimated:
可以到达堆栈底部,但我不知道如何将数据带到堆栈底部?出于简单和清晰的原因,我省略了此信息,但实际上我在主视图中有同一子类的3个表视图。我如何处理
目的地。selectionDelegate
是这样吗?这就是为什么我把pop提到root,因为我必须从两个表格向下钻取跳回来。因此,
prepareForSegue
方法有点愚蠢,因为在以后的几个视图之前,我不会切换到需要委托的表视图。此外,可能还有一些我误解了的东西或诸如此类的东西,因为我把协议放在我的表视图控制器中,当我试图将我的主视图控制器设置为它的委托时,它说协议未定义。@Rob您只需通过