如何通过有条件的展开顺序传递数据?

我尝试build立一个rss阅读器。 在“添加Feed”页面上,如果点击“添加”button,我希望检查Feed是否已成功添加。 如果添加了,则触发展开顺序,返回主页面。 如果没有添加,请留在当前页面。

我知道我可以在“添加”button上创build一个IBAction,并检查是否添加了Feed。 不过,为了添加Feed,我需要满足两个要求。

首先,在parsingurl之后,我需要知道parsing结果是否可以生成一个feed。 为了parsingurl,我需要使用mainViewController中定义的方法。

其次,我需要检查Feed是否已经存在。 如果此Feed已经存在,请不要添加它。 要检查这一点,我需要从mainViewController获取饲料数据。

目前我使用prepareForSegue将数据从主viewController传递到这个视图。 但是,对于有条件的展开顺序,我不知道如何传递数据并检查feed是否已经存在。 因为prepareForSegue只有在segue被触发时才被使用。 如果没有触发,我不能检查条件。

除了通过segue,还有其他的方式来传递其他视图的数据吗?

我不知道Objective-C,所以如果你能快速给我一些解决scheme会更好。 🙂

像Schemetrical说的那样,使用委托是访问MainViewController中的方法的简单方法。

既然你把它标记为Swift,我还会给你一个Swift代理的小例子。

首先你创build一个协议:

protocol NameOfDelegate: class { // ":class" isn't mandatory, but it is when you want to set the delegate property to weak func someFunction() -> String // this function has to be implemented in your MainViewController so it can access the properties and other methods in there } 

在你的MainViewController中你必须添加:

 class MainViewController: UIViewController, NameOfDelegate { // your code @IBAction func button(sender: UIButton) { performSegueWithIdentifier("toOtherViewSegue", sender: self) } fun someFunction() -> String { // access the other methods and return it } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "toOtherViewSegue" { let destination = segue.destinationViewController as! OtherViewController destination.delegate = self } } } 

最后一步,您必须添加委托的属性,以便您可以“交谈”。 就我个人而言,我想这个属性是两个视图控制器之间的某种门,以便他们可以相互交谈。

 class OtherViewController: UIViewController { weak var delegate: NameOfDelegate? @IBAction func button(sender: UIButton) { if delegate != nil { let someString = delegate.someFunction() } } } 

自从你在文章中提到它之后,我假设你使用了segue来访问你的其他ViewController。 这样,你可以“谈”到你的MainViewController。

编辑:

至于放松。 这也可以通过一个segue来完成。

  1. 添加: @IBAction func unwindToConfigMenu(sender: UIStoryboardSegue) { }到您的MainViewController。
  2. 在你的故事板中,你的OtherViewController的顶部有3个图标。 点击一个正方形的圆形黄色,以确保ViewController被选中,而不是内部的一些元素。
  3. 控制拖动(或鼠标右键拖动)从相同的圆形黄色与正方形里面到最右边的红色正方形图标。 这样做popup一个菜单,您可以select放松继续。
  4. 点击你刚刚创build的新的segue。 给它一个像“backToMain”
  5. 将下面的代码添加到OtherViewController

看来我不能发布任何代码了? :o稍后将添加它。

你总是可以使用代表。

在您的添加提要页面中设置委托,并获取mainViewController以符合委托。 添加委托方法( - (BOOL)canGenerateFeed:(NSURL *)url )和委托属性( @property (weak, nonatomic) id <AddFeedControllerDelegate> delegate )。

当你的add feed页面调用[self.delegate canGenerateFeed:url]并且你的mainViewController符合委托的时候, mainViewController的方法被调用(应该按照方法声明的方式回复BOOL)。 然后,您可以相应地回复“是”或“否”,然后回传到“添加馈送”页面。

 - (UIViewController*)viewControllerForStoryboardName:(NSString*)storyboardName class:(id)class { UIStoryboard* storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil]; NSString* className = nil; if ([class isKindOfClass:[NSString class]]) className = [NSString stringWithFormat:@"%@", class]; else className = [NSString stringWithFormat:@"%s", class_getName([class class])]; UIViewController* viewController = [storyboard instantiateViewControllerWithIdentifier:[NSString stringWithFormat:@"%@", className]]; return viewController; } // get the view controller ViewController* viewController = (ViewController*)[self viewControllerForStoryboardName:@"MyStoryboard" class:[OtherViewController class]]; // Pass data here viewController.data = myData; // or you can push it [self.navigationController pushViewController:viewController animated:YES];