2

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

ViewController 标头

#import "Picker.h"

视图控制器实现

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 之外还有其他东西。

谢谢!

4

3 回答 3

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

apicker会从它的方法发送这样的通知scrollViewDidEndDecelerating

[[NSNotificationCenter defaultCenter] postNotificationName:kPickerScrollViewChanged object:self];
于 2012-06-30T17:03:50.307 回答
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 的滚动视图委托方法中,您可以使用以下方法将消息传递给视图控制器:

-(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.
}
于 2012-06-30T17:06:36.973 回答
1

在您的视图控制器类中,您应该将观察者(注册通知)添加到 viewDidLoad 方法中。在里面scrollViewDidEndDecelerating你应该发布一个通知。

因此,在 viewDidLoad 中:

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

在你的 scrollViewDidEndDecelerating 里面,

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

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

于 2012-06-30T17:07:51.223 回答