如何更新当前的ModalViewController返回的滑块和开关的值?

我有他们有一些设置属性的帐户。 作为设置有UISlider值和UISwitch值。 当我运行应用程序它工作正常,我可以显示从NSUserDefaults的最后一个值,因为viewDidLoad方法的作品。 顺便说一下,我的应用程序有一个标签栏控制器。 所以当我切换选项卡它也能正常工作,因为我可以得到开关和滑块的值,并在viewWillAppear方法更新它们。 但在我的设置开关,我提出了一个视图,其中有用户列表,所以用户可以select任何帐户。 当我从呈现视图回来时,我无法更新开关和滑块的值。 我需要一个触发器方法来更新它们的值。 有没有办法做到这一点?

是的,这是苹果的三种方法:

 1) Delegation 2) NSNotificationCenter 3) KVO 

但是,对于您的特定情况模式的观点,代表团模式是苹果公司build议的模式,也是我会推荐的模式。

它需要比其他2个选项更多的编码。

首先,您必须在您以模态方式呈现的视图中声明协议:

 in your .h @protocol MyProtocol; @interface MyClass : NSObject @property (nonatomic, weak) id<MyProtocol> delegate; @end @protocol MyProtocol <NSObject> -(void)updateValues:(NSArray *)values; @end 

然后,在从原始视图控制器模态地呈现模态视图之前,只需像这样设置这个图标

 myModallyPresentedController.delegate = self; 

然后让你的呈现视图控制器采用协议

 in your .h MyPresentingViewController : UIViewController <MyProtocol> in .m //Implement method: -(void)updateValues:(NSArray *)values { //Update Values. } 

最后当用户按下“完成”

你可以打电话

 [delegate updatedValues:myValues]; 

并据此更新。

希望有所帮助。

我前一段时间写过,基本上只是将其粘贴到所有这些问题中。 顺便说一句,如果任何人有build议,这将使这更容易理解/更好,我很乐意听到他们。

您可以使用代表在类之间传递信息; 这对于使用方法时要传递信息的情况特别有用。

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