2010-07-15 97 views
2

我們正在使用一些自定義視圖來處理項目。我們有以下層次:我如何處理iOS開發中的自定義事件?

的UIViewController - > UIScrollView中(自定義子類) - > UIView的(自定義子類)

我們呈現動態生成按鈕的網格。當用戶點擊屬於定製滾動視圖的UIViews之一,我們火,看起來像這樣的方法:

- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer { 
    [[self superview] itemSelected:self]; 
} 

在這種情況下,超級觀點是我們的UIScrollView的自定義子類。從這裏我們開始另一種方法:

- (void) itemSelected: (id)selectedItem { 
    itemView *item = selectedItem; 
    [[self superview] initSliderViewForItemNamed:item.name]; 
    item = nil; 
} 

現在,這裏是東西突破的地方。我們想在UIViewController中觸發另一個方法來在視圖層次結構的頂部加載一個新視圖。因此,在UIViewController中,我們有這個方法測試成功:

- (void) initSliderViewForItemNamed:(NSString *)selectedItemName { 
    NSLog(@"Selected item was found! %@",selectedItemName); 
} 

但我們永遠無法達到這點和應用程序崩潰。這是因爲我們無法在這裏引用UIViewController。相反,我們引用了UIViewController的視圖屬性。因此,我們的實際對象層次是:

UIViewController.view - > UIScrollView中(自定義子類) - > UIView的(自定義子類)

這使我兩個問題。

  1. 我們如何引用屬於控制器視圖屬性的子視圖中的UIViewController?
  2. 這種方法是錯綜複雜的。有一個更好的方法嗎?我們是否應該將UIViewController作爲UIScrollView的自定義子類的委託來分配?

回答

0

我最終做了什麼來解決這個問題是將視圖控制器作爲滾動視圖的委託。它看起來像這樣:

itemScrollView = [[ItemScrollView alloc] initWithFrame:CGRectMake(...)]; 
    [itemScrollView setDelegate:self];  
    [self.view addSubview: itemScrollView]; 

然後在我的ItemScrollView實現我可以引用到ViewController有:

[[self delegate] initSliderViewForItemNamed:selectedItem.name]; 

非常感謝大家誰回答。因此,將View Controller設置爲代表是正確的答案,然而,沒有人詳細描述如何做到這一點。所以我在這裏回答了這個問題。其他信息也可以在涉及代表這個問題的發現:

How do I create delegates in Objective-C?

0

難以準確理解你想達到的目標 - 你能描述一下最終目標嗎? - 這種方法聽起來相當複雜和令人費解。我想我有一個解決方案,但不知道它是否相關:P

+0

這組視圖允許用戶打開一個項目。我們想爲視圖層次結構頂部的選定對象實例化一個項目視圖。當用戶關閉一個項目時,他們返回到這個視圖。 – 2010-07-15 06:16:06

+0

會假設我們的skype convo固定它:D – 2010-07-15 06:24:51

0

Jim您應該在您的自定義uiview子類上設置一個委託,並讓您查看控制器是否委託並符合您剛創建的協議以及您將被罰款(即:一個tableview中是做什麼的)

0

星爺或者使用一個委託或您實現: -

  • (無效)的touchesBegan:(NSSet中*)觸及withEvent:方法(的UIEvent *)事件

  • (無效)touchesEnded:(NSSet中*)觸及withEvent:方法(*的UIEvent)事件

取決於您希望如何處理觸摸。

0

慣用的方式做你想要將發送消息了responder chain什麼。 UIViewController參與響應者鏈,因此它會收到消息。