将信息传递给模态视图控制器

时间:2014-07-21 12:56:25

标签: ios xcode ios7 swift ios8

我已经在这里阅读了一些关于从视图控制器传回数据的内容,我知道有一些关于这一点的肯定没有 - 但我想询问有关以这种方式传递数据的最佳实践并询问是否我在下面做的是好吗?

我有3个视图控制器(类ViewControllerA,B和C),当用户单击一个按钮(来自A或B)时,它会使用它来将它们带到C:

let vc = new ViewControllerC()
self.presentViewController(vc, animated: true, completion: nil)

向前传递数据 所以上面的'self'要么是A,要么是B.我的想法是,如果我想发送C一些信息,我可以只创建一个C属性(比如字符串或int等等)并在之前分配它我做了一个presentViewController。是吗?

即。      vc.propertyHere =“我的价值”

传递数据 如果在C中发生了我想要发回A或B的事情,那么最佳做法是什么? 要返回A或B,我知道我可以这样做:      self.dismissModalViewControllerAnimated(真)

我应该首先实例化A或B(可能是他们的基本类型)并访问类似的属性以获取我想要传回的信息吗?例如,如果A和B都从某个类继承,我可以在该类上创建一个属性,只需从C访问/设置它。这是正确的举动吗?还是有更好的方法? 即。

     callingViewController.myProperty = "my value i'm passing back"

谢谢!

3 个答案:

答案 0 :(得分:1)

传递数据 - 您的实施很好。

传回数据 -

不要再次发起A和B,这是我对新开发者的一个常见错误。 A或B已经存在,你从A / B来到这个新的控制器,你只想将一个值传递回该类。

这里使用的最佳做法是委托设计模式。

步骤:

  1. 创建一个协议,声明在A / B中调用的方法。

  2. 在C named delegate中实现一个属性。

  3. 在呈现视图C之前,请指定代理人。

  4. 每当您想要将任何信息传递给A或B时,请调用委托方法。

  5. 在另一个SO答案中解释了实施委托:How do I create delegates in Objective-C?

答案 1 :(得分:0)

您可以使用委托模式来实现此目的。这是一个小例子,请看。

@protocol SecondViewControllerDelegate;

@interface SecondViewController;

SecondViewController : UIViewController

@property (nonatomic, assign) id<SecondViewControllerDelegate> delegate;
@property (nonatomic, retain) NSArray* someArray;

@end

@protocol SecondViewControllerDelegate
- (void)secondViewControllerDidFinish:(SecondViewController*)secondViewController;
@end

<强> SecondViewController.m:

@implementation SecondViewController

@synthesize delegate;
@synthesize someArray;

- (void)dealloc
{
    [someArray release];
    [super dealloc];
}

- (void)someMethodCalledWhenUserIsDone
{
    [delegate secondViewControllerDidFinish:self];
}

<强> FirstViewController.h:

#import SecondViewController

@interface FirstViewController : UIViewController <SecondViewControllerDelegate>
{
    ...
}

@end

<强> FirstViewController.m:

@implementation FirstViewController

- (void)secondViewControllerDidFinish:(SecondViewController*)secondViewController
{
    NSArray* someArray = secondViewController.someArray
    // Do something with the array
}

@end

答案 2 :(得分:0)

对于下坡技术而言,您在视图控制器上设置属性的提议在技术上没有任何问题

vc.propertyHere = "my value"

但是有一个名为Dependancy Injection的模式,可以在父母和孩子之间提供更清晰的对话。

因此,如果您的新视图控制器需要某些功能,您可以在init处将其提供给实例。

import Foundation
import UIKit

class ObjectTypeA {}
class ObjectTypeB {}

class FooVC : UIViewController {

var importantThing:ObjectTypeA!
var otherImportantThing:ObjectTypeB!

init(somethingINeed:ObjectTypeA, somethingElseINeed:ObjectTypeB) {

    importantThing = somethingINeed
    otherImportantThing = somethingElseINeed

    super.init(nibName:nil,bundle:nil)

}


}

class BarVC : UIViewController {

    func yo() {

        let object1 = ObjectTypeA()
        let object2 = ObjectTypeB()

        let newVC = FooVC(somethingINeed: object1, somethingElseINeed: object2)

        self.presentViewController(newVC, animated: true, completion: nil)

    }

}

所以继续做你正在做的事情但是看看未来的其他模式。

对于上传数据或事件,其他人描述的委托模式最好。这样父母和孩子之间就没有紧密的联系。采用该协议的任何对象都可以作为委托。

e.g

class BlueSuedeShoes{}

protocol FunkyProtocol {

    func danceLikeElvis(shoes:BlueSuedeShoes)

}

class LumpyVC:UIViewController  {

    var delegate:FunkyProtocol?

    func somethingHappened() {

        let myShoes = BlueSuedeShoes()

        self.delegate?.danceLikeElvis(myShoes)
    }
}

以及实现该协议的类

class SmoothVC:UIViewController,FunkyProtocol {


    func danceLikeElvis(shoes: BlueSuedeShoes) {

        dontStepOn(shoes)

    }

    func dontStepOn(shoes:BlueSuedeShoes) {


    }


}