-1

我尝试构建一个 RSS 阅读器。在“添加提要”页面,如果我点击“添加”按钮,我希望检查提要是否添加成功。如果添加了,则触发 unwind segue,并返回主页面。如果没有添加,则停留在当前页面。

我知道我可以在“添加”按钮上构建一个 IBAction,并检查是否添加了提要。但是,我需要满足两个要求才能添加提要。

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

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

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

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

我不知道objective-C,所以如果你能迅速给我一些解决方案会更好。:)

4

3 回答 3

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,因为您在帖子中提到了它。这样,您就可以与您的 MainViewController 进行“对话”。

编辑:

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

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

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

于 2015-04-12T06:47:52.163 回答
0

您始终可以使用委托。

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

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

于 2015-04-12T05:49:11.967 回答
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];
于 2015-04-12T07:32:52.177 回答