Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从presentModalViewController返回时,如何更新滑块和开关的值?_Iphone_Objective C_Ios_Xcode - Fatal编程技术网

Iphone 从presentModalViewController返回时,如何更新滑块和开关的值?

Iphone 从presentModalViewController返回时,如何更新滑块和开关的值?,iphone,objective-c,ios,xcode,Iphone,Objective C,Ios,Xcode,我有一些帐户,它们有一些设置属性。作为设置,有UISlider的值和UISwitch的值。当我运行应用程序时,它工作正常,我可以显示NSUserDefaults中的最后一个值,因为viewDidLoad方法工作正常。顺便说一下,我的应用程序有一个选项卡栏控制器。所以,当我切换选项卡时,它也可以正常工作,因为我可以获得switch和slider的值,并在ViewWillExample方法中更新它们。但在我的设置开关中,我提供了一个视图,其中包含用户列表,因此用户可以选择任何帐户。当我从当前视图返回

我有一些帐户,它们有一些设置属性。作为设置,有UISlider的值和UISwitch的值。当我运行应用程序时,它工作正常,我可以显示NSUserDefaults中的最后一个值,因为viewDidLoad方法工作正常。顺便说一下,我的应用程序有一个选项卡栏控制器。所以,当我切换选项卡时,它也可以正常工作,因为我可以获得switch和slider的值,并在ViewWillExample方法中更新它们。但在我的设置开关中,我提供了一个视图,其中包含用户列表,因此用户可以选择任何帐户。当我从当前视图返回时,我无法更新开关和滑块的值。我需要一个触发器方法来更新它们的值。有什么方法可以做到这一点吗?

我不久前写了这篇文章,基本上就是把它粘贴到所有这些问题中。顺便说一句,如果有人有一些建议可以让这更容易理解/更好,我很乐意听听

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

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

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

1) Delegation
2) NSNotificationCenter
3) KVO
然而,对于您的特定案例,一个模态视图,委托模式是Apple推荐的模式,也是我推荐的模式

不过,它需要比其他两个选项多一点编码

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

in your .h

@protocol MyProtocol;

@interface MyClass : NSObject

@property (nonatomic, weak) id<MyProtocol> delegate;

@end

@protocol MyProtocol <NSObject>

-(void)updateValues:(NSArray *)values;

@end
然后让您的演示视图控制器采用该协议

in your .h

MyPresentingViewController : UIViewController <MyProtocol>

in .m

//Implement method:

-(void)updateValues:(NSArray *)values {
   //Update Values.
}
并相应更新


希望能有所帮助。

谢谢,但我的appDelegate对象中已经有了appDelegate.activeAccount.switchValue和.sliderValue属性,因此我需要查看控制器是否知道我的值。我可以在程序启动时按用户默认值以viewDidLoad进行更新。但当我从显示视图返回时,值不会改变,因为没有方法更新它们。即使我写了更新方法。顺便说一下,我的两个ViewController之间已经存在委派。@M.SalihKocak我不确定我是否正确理解了问题,但是如果已经存在委派,为什么不创建方法并发送给委派。或者,您可以使用NSNotificationCenter并向观察者发送消息以更新自己。为什么更喜欢不安全的未恢复而不是悬挂指针免疫的弱?委托协议方法来自ARCSo之前,这是一个历史事故,您现在可以使用弱来修复,对吗?可能,我还没有深入研究不安全和不安全之间的区别。我想使用弱小可以让我检查委托是否为零(如果已解除分配),并比硬错误访问崩溃更恰当地处理错误。@Yar我花了很长时间才记住这是什么帖子。无论如何,虚弱不能用于iOS 4部署目标或雪豹,但不安全的未恢复可以。只是有个问题。当然,在上面的代码中,我使用的是故事板方法,所以没有理由担心iOS4。尽管我会让你知道;我想知道他们为什么不保留不安全的东西,我猜这是为了传统的支持。
in your .h

MyPresentingViewController : UIViewController <MyProtocol>

in .m

//Implement method:

-(void)updateValues:(NSArray *)values {
   //Update Values.
}
[delegate updatedValues:myValues];