我创建了一个类(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之外还有其他东西。
谢谢!
答案 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];
不要忘记在不需要时删除观察者。