2012-06-30 52 views
2

返回值我創建的類(UIView的),其具有內部一個UIScrollView。通過委託「scrollViewDidEndDecelerating」我可以得到3個結果(1,2,3)。 如何這個結果發送到主視圖控制器?從其它類代表

的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類,因爲它除了滾動型等事情。

謝謝!

回答

1

我建議你創建一個PickerDelegate協議與一個方法到所需的值返回給主視圖控制器。

@protocol PickerDelegate <NSObject> 

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

@end 

揀貨員有一個屬性:

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

然後你可以設置你的視圖控制器使用picker.delegate = self;

在機械手的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. 
} 
+0

正是我想要的,非常感謝! – Vins

2

您可以Picker類中定義一個屬性:

@property (nonatomic, assign) MyViewController* controller; 

和initalize選擇器的情況下是這樣的:

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

那麼你可以做:

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

    [self.controller myMethod]; 
    ... 

這是已知的作爲依賴注入,如果它有意義創建如此強大的耦合amo就沒關係這兩個班級。你可以創建一個委託協議,使這種交互更加完善。

你有另一種選擇,它可以讓你避免耦合,通過使用NSNotificationCenter通知。

在這種情況下,一個對象(控制器)將用於觀測PickerScrollViewChanged註冊通知:

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

一個picker將從其scrollViewDidEndDecelerating方法發送這樣的通知:

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

謝謝,但以這種方式,該類不能在多個類中使用。 – Vins

+0

爲什麼不呢?你決定什麼樣的簽名有你的方法,如果你需要傳遞一個引用的選擇器,你是受歡迎的......的確,這就是我通過例子做的事情...... – sergio

1

在您的視圖控制器類,你應該添加觀察員(註冊通知)到viewDidLoad方法。 裏面scrollViewDidEndDecelerating你應該發佈通知。

所以,在viewDidLoad中:

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

裏面你scrollViewDidEndDecelerating,

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

不要忘記,當它不要求刪除觀察者。