2012-07-20 3 views
1

일부 설정 속성이있는 계정이 있습니다. 설정 값은 UISlider이고 값은 UISwitch입니다. 응용 프로그램을 실행할 때 올바르게 작동합니다. 왜냐하면 viewDidLoad 메서드가 작동하기 때문에 NSUserDefaults에서 마지막 값을 표시 할 수 있습니다. 내 응용 프로그램에는 탭 막대 컨트롤러가 있습니다. 그래서 내가 switch와 slider의 값을 얻을 수 있고 viewWillAppear 메소드에서 그것들을 업데이트 할 수 있기 때문에 나는 탭을 바꿀 때 잘 동작합니다. 하지만 내 설정 스위치에서 나는 거기에 사용자 목록이있는보기를 제시하므로 사용자는 어떤 계정을 선택할 수 있습니다. 내가 다시 제시된보기에서 나는 스위치와 슬라이더의 값을 업데이트 할 수 없습니다. 그들의 값을 업데이트하는 방아쇠 방법이 필요합니다. 그것을 할 방법이 있습니까?presentModalViewController에서 돌아올 때 슬라이더와 스위치 값을 업데이트하는 방법은 무엇입니까?

답변

0

예이 그것을 할 수있는 3 개 사과 방법이다 : 그러나

1) Delegation 
2) NSNotificationCenter 
3) KVO 

를 특정 사건에 대한 모달 뷰를 위임 패턴은 하나의 애플이 권장하고, 내가 추천 할 것입니다 게다가.

다른 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]; 

를 호출하고 그에 따라 업데이트 할 수 있습니다.

희망이 있습니다.

+0

고마워요하지만 가치 appDelegate 개체에 값을 appDelegate.activeAccount.switchValue 및 .sliderValue 이미 있으므로 viewController 내 값을 알고 있어야합니다. 프로그램이 viewDidLoad로 시작될 때 사용자 기본값으로 업데이트 할 수 있습니다. 그러나 제시된 뷰 값에서 돌아올 때 뷰 값을 업데이트 할 방법이 없으므로 값은 변경되지 않습니다. 비록 내가 업데이트 방법을 썼다 고해도. 그런데 이미 내 두 viewController 사이에 위임이 있습니다. –

+0

@ M.SalihKocak 문제를 올바르게 이해하고 있는지 확실하지 않지만 위임이있는 경우 이미 메서드를 만들어서 대리자에게 보냅니다. 또는 NSNotificationCenter를 사용하여 옵저버에게 메시지를 보내 자신을 업데이트 할 수 있습니다. –

0

나는 이것을 얼마 전에 작성했으며 기본적으로이 모든 질문에 붙여 넣습니다. BTW 누구나 쉽게 이해할 수있는 제안을하면/듣기를 좋아합니다.

대리인을 사용하여 클래스간에 정보를 전달할 수 있습니다. 이는 메소드가 사용될 때 정보를 전달하려는 경우에 특히 유용합니다.

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

왜 dangling-pointer-immune 인'weak'에'unsafe_unretained'을 선호합니까? –

+0

델리게이트 프로토콜 방법은 ARC – Dustin

+0

이전입니다. 그래서 지금은 약한 것을 사용하여 고칠 수있는 역사적인 사고였습니까? –

관련 문제