2013-02-25 62 views
0

我所试图做的事:我有的iOS UiPickerView(-Helper)将发送消息

一个ViewController

@implementation ViewController 
@synthesize myPicker; 
@synthesize myPickerHelper; 
@synthesize label; 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    myPickerHelper = [[UIPickerViewHelper alloc]initWithUIPickerView:myPicker andNumberOfComponents:4]; 

    [myPickerHelper.valuesForComponent1 addObject:@"TEST1"]; 
    [myPickerHelper.valuesForComponent1 addObject:@"TEST2"]; 
    ; 

    [weightsPicker reloadAllComponents]; 
    [weightsPicker selectRow:0 inComponent:0 animated:YES]; 
    //TODO receive message from picker helper. 
    //label.text = ... set a listner (like that one in java) or what else 
    } 

} 

而且我有一个PickerViewHelper:(它处理的委托和数据源的问题)

@interface UIPickerViewHelper : NSObject <UIPickerViewDelegate, UIPickerViewDataSource, OnPickerViewChangeDelegate> 

@implementation UIPickerViewHelper 
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    //TODO send message to controller view. 
} 

和协议:

@protocol OnPickerViewChangeDelegate 
@optional 
-(void)onChange:(NSString*)result; 
@end 

我想要的是在我的UiPickerViewHelper类中使用协议方法“onChange”,以便我的标签(在我的ViewController中)将被通知。 我知道如何解决在Java中,但我不知道如何解决在目标c。

问候

回答

1

UIPickerViewHelper.h

@property (nonatomic, assign) id <OnPickerViewChangeDelegate> delegate 

UIPickerViewHelper.m

@synthesize delegate; 

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    //TODO send message to controller view. 
    [self.delegate onChange:[NSString stringWithFormat:@"Selected row %d", row]]; 
} 

ViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    myPickerHelper = [[UIPickerViewHelper alloc]initWithUIPickerView:myPicker andNumberOfComponents:4]; 
    myPickerHelper.delegate = self; 

    ... 
} 

-(void)onChange:(NSString*)result { 

    NSLog(@"Here is the result: %@", result); 
    label.text = result; 
} 
+0

OK !!!这样可行!但我不明白为什么...为什么视图控制器知道(或可以覆盖)onchange方法? – 2013-02-25 15:11:38

+0

由于视图控制器符合'OnPickerViewChangeDelegate'协议,这意味着视图控制器必须实现该方法。它不是压倒性的,它只是在实施它。 – 2013-02-25 15:16:52

+0

@ user2075873请将我的答案标记为已接受(复选标记),如果它帮助您:) – 2013-02-25 15:35:02

0

没有UIPickerview委托方法进行更改。 因为它会停在任意位置和

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 

方法将被调用,因此,如果用户退出选择器停止动画/轧制前... 隐藏的UIPickerView必须调用最后选定的值uipicker方法同时滚动/动画。

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
    { 
    if(delegate respondsToSelector:@selector(onChange:)){ 
     [delegate onChange:row];//return the index of row selected 
    } 
    }