我有他们有一些设置属性的帐户。作为设置,有 的值UISlider
和 的值UISwitch
。当我运行应用程序时它工作正常,我可以显示最后一个值,NSUserDefaults
因为 viewDidLoad 方法有效。顺便说一下,我的应用程序有一个标签栏控制器。因此,当我切换选项卡时它也可以正常工作,因为我可以获取开关和滑块的值并在 viewWillAppear 方法中更新它们。但是在我的设置开关中,我呈现了一个视图,其中包含用户列表,因此用户可以选择任何帐户。当我从呈现的视图中返回时,我无法更新开关和滑块的值。我需要一个触发方法来更新它们的值。有没有办法做到这一点?
问问题
307 次
2 回答
0
是的,这是苹果的 3 种方法:
1) Delegation
2) NSNotificationCenter
3) KVO
但是,对于您的特定情况,模式视图,委托模式是 Apple 推荐的一种,也是我推荐的一种。
不过,它需要比其他 2 个选项更多的编码。
首先,您必须在模态显示的视图中声明协议:
in your .h
@protocol MyProtocol;
@interface MyClass : NSObject
@property (nonatomic, weak) id<MyProtocol> delegate;
@end
@protocol MyProtocol <NSObject>
-(void)updateValues:(NSArray *)values;
@end
然后在从原始视图控制器模态显示模态视图之前,只需像这样设置 delgate
myModallyPresentedController.delegate = self;
然后让您的呈现视图控制器采用协议
in your .h
MyPresentingViewController : UIViewController <MyProtocol>
in .m
//Implement method:
-(void)updateValues:(NSArray *)values {
//Update Values.
}
最后当用户按下“完成”
你可以打电话
[delegate updatedValues:myValues];
并相应更新。
希望有帮助。
于 2012-07-20T13:19:23.213 回答
0
我前段时间写了这篇文章,基本上只是将它粘贴到所有这些问题中。顺便说一句,如果有人有建议可以使这更容易理解/更好,我很想听听他们的意见。
您可以使用委托在类之间传递信息;这对于您希望在使用方法时传递信息的情况特别有用。
Delegates
//In parent .m file:
//assign the delegate
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"segueName"])
{
childController *foo = segue.destinationViewController;
foo.delegate = self;
}
}
//implement protocol method(s):
- (void) methodName:(dataType*) dataName
{
//An example of what you could do if your data was an NSDate
buttonLabel.titleLabel.text = [[date description] substringToIndex:10];
}
//In parent .h file:
//import child header
#import "ChildName.h"
//indicate conformity with protocol
@interface ParentName : UIViewController <ChildNameDelegate>
//In child .h file
//declare protocol
@protocol ChildNameDelegate
- (void) methodName:(dataType*) dataName;
@end
//declare delegate
@property (weak, nonatomic) id<ChildNameDelegate> delegate;
//In child .m file
//synthesize delegate
@synthesize delegate;
//use method
- (IBAction)actionName:(id)sender
{
[delegate methodName:assignedData];
}
于 2012-07-20T13:18:23.933 回答