如何将一个variables从一个类传递给另一个?
目的
我需要我的应用程序将一个variablesmyVariable
的值从一个firstClass
类firstClass
给另一个只有当这个variables改变了它的值的时候。
码
为此,我想使用willSet
属性。 虽然在Swift中,variables声明之后不能使用它。
class firstClass: NSObject { var myVariable = 0 func myFunction { myVariable = 5 } } class secondClass: NSObject { var otherClass = firstClass() // How do I retrive the value of the variable right after its value changed? }
我也想添加一个NSNotification
,但是这并没有帮助,因为它没有传递一个值。 NSNotification
仅提醒其更改。
let myVariableNotification = NSNotification(name: "myVariableNotification", object: nil) class firstClass: NSObject { var myVariable = 0 func myFunction { myVariable = 5 notificationCenter.postNotification(myVariableNotification) } } class secondClass: NSObject { var otherClass = firstClass() NSNotificationCenter.defaultCenter().addObserverForName("myVariableNotification", object: nil, queue: NSOperationQueue.mainQueue() usingBlock: { notification in println("The variable has been updated!") }) }
题
一旦这个variables改变了它的值,我似乎无法传递一个variables。 我怎样才能做到这一点?
你应该使用委托协议。 有关更多信息,请查看此文档。
在import
语句之后的secondClass
设置一个protocol
,如下所示:
protocol InformingDelegate { func valueChanged() -> CGFloat }
在同一个secondClass
里面创build一个delegate
variables(有些build议它应该被标记为weak
):
var delegate: InformingDelegate?
然后,创build一些你将访问更改的值的方法。 您可以将其value
为例如:
func callFromOtherClass() { value = self.delegate?.valueChanged() }
这是第二secondClass
。 现在到第一firstClass
。
在这里你只需要在类定义之后添加InformingDelegate
来符合协议,就像这样:
class firstClass: UIViewController, InformingDelegate { ... }
然后,通知编译器,你将通过创build它的实例成为另一个类的委托,并将自己设置为委托:
var secondVC : secondClass = secondClass() secondClass.delegate = self secondClass.callFromOtherClass() // This will call the method in the secondClass // which will then ask its delegate to trigger a method valueChanged() - // Who is the delegate? Well, your firstClass, so you better implement // this method!
最后一件事情是通过实现其方法实际上符合协议:
func valueChanged() -> CGFloat { return myVariable // which is 5 in your case (value taken from a question) }
这会将myVariable
值(本例中为5) value
给另一个类中的value
。
编程的最好方法是使用NSNotification。 在你的第二个viewcontroller中添加一个观察者来监听这个variables值的变化。 在第一个视图控制器中,只要这个variables改变了值,就向第二个视图控制器正在监听的观察者发送一个通知。
您将不得不使用“userInfo”变体并传递一个包含myVariable值的NSDictionary对象:
NSDictionary* userInfo = @{@"myVariable": @(myVariable)}; NSNotificationCenter *notifying = [NSNotificationCenter defaultCenter]; [notifying postNotificationName:@"myVariableNotification" object:self userInfo:userInfo];
在你的第二个viewcontroler调用你的通知中心方法设置通知及其调用方法如下:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeInValue:) name:@"myVariableNotification" object:nil];
调用方法:
-(void) changeInValue:(NSNotification*)notification { if ([notification.name isEqualToString:@"myVariableNotification"]) { NSDictionary* userInfo = notification.userInfo; NSNumber* myVariable = (NSNumber*)userInfo[@"myVariable"]; NSLog (@"Successfully received test notification! %i", myVariable.intValue); } }
- RealmSwift初始化程序 – Xcode修复程序 – 它一直搞错了
- 检测Realm.io数据库是否需要迁移 – 如果是的话,将其销毁
- 删除UISearchBar的顶部和底部边界和阴影? iOS Swift
- 如何使用带有标记和参数的Alamofire来上传图片?
- Firebase queryOrderedByChild()方法不给出sorting数据
- 如何打开文件并在其中附加一个string,swift
- 在swift中调用dismissViewController之后如何调用reload table view?
- 使用UITableViewAutomaticDimension行高自动滚动到表的底部? – Swift,iOS 8+
- 如何在Swift中录制video与avfoundation?