从其他类委托返回值

时间:2012-06-30 16:53:05

标签: objective-c xcode uiscrollview

我创建了一个类(UIView),里面有一个UIScrollview。通过委托“scrollViewDidEndDecelerating”我可以有3个结果(1,2,3)。 如何将此结果发送到主ViewController?

ViewController标题

#import "Picker.h"

ViewController实施

picker = [[Picker alloc]initWithFrame:CGRectMake(10, 10, 300, 300)];
[self.view addSubview:picker];

选择器实施

(...)

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    if (scrollView.contentOffset.x <= 100) {

        int result = 1;

    } else if (scrollView.contentOffset.x > 100 && scrollView.contentOffset.x <= 200) {

        int result = 2;

    } else {

        int result = 3;

    }
}

(...)

我必须创建一个UIView类,因为除了Scrollview之外还有其他东西。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以在Picker类中定义属性:

@property (nonatomic, assign) MyViewController* controller;

并将Picker的实例初始化为:

picker = [[Picker alloc]initWithFrame:CGRectMake(10, 10, 300, 300) andController:self];

然后你可以这样做:

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    [self.controller myMethod]; 
    ...

这称为依赖注入,如果有意义在两个类之间创建这种强耦合就没问题。您可以创建一个委托协议,以使这种交互更加充分。

您可以通过NSNotificationCenter使用通知来避免耦合。

在这种情况下,一个对象(您的控制器)将注册观察PickerScrollViewChanged通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMethod:) name:kPickerScrollViewChanged object:nil];

picker会从scrollViewDidEndDecelerating方法发送此类通知:

[[NSNotificationCenter defaultCenter] postNotificationName:kPickerScrollViewChanged object:self];

答案 1 :(得分:1)

我建议你使用一种方法创建一个PickerDelegate协议,将所需的值返回给主视图控制器。

@protocol PickerDelegate <NSObject>

-(void)picker:(Picker *)picker didScrollToResult:(NSInteger)result;

@end

Picker有一个属性:

@property (nonatomic, assign) id<PickerDelegate> delegate;

然后,您可以使用picker.delegate = self;

将视图控制器设置为选择器代理

在Picker UIView的scrollview委托方法中,您可以使用以下方法将消息传递给视图控制器:

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.x <= 100) {
        int result = 1;
    } else if (scrollView.contentOffset.x > 100 && scrollView.contentOffset.x <= 200) {
        int result = 2;
    } else {
        int result = 3;
    }
    [self.delegate picker:self didScrollToResult:result];
}

视图控制器需要实现选择器委托方法:

-(void)picker:(Picker *)picker didScrollToResult:(NSInteger)result {
    // View controller now has result variable to action upon.
}

答案 2 :(得分:1)

在视图控制器类中,您应该将observer(注册通知)添加到viewDidLoad方法中。 在scrollViewDidEndDecelerating内,您应该发布通知。

所以,在viewDidLoad:

[[NSNotificationCenter defaultCenter]
 addObserver:self
 selector:@selector(scrollViewZoomed:)
 name:@"scrollViewDidZoom"
 object:nil];

在scrollViewDidEndDecelerating中,

[[NSNotificationCenter defaultCenter]
 postNotificationName:@"scrollViewDidZoom"
 object:self];

不要忘记在不需要时删除观察者。