如何在条件展开segue中传递数据?

时间:2015-04-12 05:27:21

标签: ios swift segue unwind-segue

我尝试构建一个rss阅读器。在“添加Feed”页面上,如果点击“添加”按钮,我希望检查是否成功添加了Feed。如果已添加,则触发展开segue,然后返回主页面。如果未添加,请保留当前页面。

我知道我可以在“添加”按钮上建立IBAction,并检查是否添加了Feed。但是,为了添加Feed,我需要满足两个要求。

首先,在我解析url后,我需要知道解析结果是否可以生成一个feed。要解析url,我需要使用mainViewController中定义的方法。

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

目前我使用prepareForSegue将数据从主viewController传递到此视图。但对于条件展开segue,我不知道如何传递数据并检查Feed是否已存在。因为只有在触发segue时才使用prepareForSegue。如果没有触发segue,我无法检查条件。

除了通过segue,还有其他方法可以从其他视图传递数据吗?

我不知道Objective-C,所以如果你能在swift中给我一些解决方案会更好。 :)

3 个答案:

答案 0 :(得分:1)

与Schemetrical一样,使用委托是访问MainViewController中方法的简单方法。

由于您将此标记为Swift,我还将为您提供Swift中委托的一个小示例。

首先创建一个协议:

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,因为您在帖子中提到了它。通过这种方式,您可以随时随地进行#34;到您的MainViewController。

编辑:

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

  1. @IBAction func unwindToConfigMenu(sender: UIStoryboardSegue) { }添加到您的MainViewController。
  2. 在您的故事板中,OtherViewController顶部有3个图标。单击内部有方形的圆形黄色以确保选中ViewController而不是内部的某些元素。
  3. 控制拖动(或鼠标右键拖动)从相同的圆形黄色,内部有正方形到最右边的红色正方形图标。这样做会弹出一个菜单,您可以在其中选择展开segue。
  4. 点击刚刚创建的新segue。给它一个像" backToMain"
  5. 这样的标识符
  6. OtherViewController
  7. 中添加类似下面代码的内容

    我似乎无法发布任何代码了吗? :o稍后会添加。

答案 1 :(得分:0)

您始终可以使用代理人。

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

当您的添加Feed页面调用[self.delegate canGenerateFeed:url]并且您的mainViewController符合该委托时,将调用mainViewController中的方法(应按方法声明中的说明回复BOOL)。然后您可以相应地回复“是”或“否”,这将被发送回添加供稿页面。

答案 2 :(得分:0)

- (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];