2009-11-10 25 views
0

我想獲得一個子視圖成爲firstResponder。我的理解是,這是在viewDidAppear方法中完成,像這樣:但是如何做一個子視圖firstResponder

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

,當我插入子視圖在其父視圖的viewDidLoad方法:

​​

同時超控canBecomeFirstResponder返回YES:

- (void)viewDidLoad { 
    subViewController = [[SubViewController alloc] init]; 
    [self.view insertSubview: subViewController.view atIndex: 0]; 
    [subViewController viewDidAppear: NO]; 
    [super viewDidLoad]; 

}

(ⅰ調用視圖手動打開,因爲它不會自動觸發),子視圖不會成爲firstResponder。

爲什麼subview不會成爲firstResponder?我怎麼能讓它firstResponder?

感謝,

mbotta

順便說一句,這是我原來的問題的改寫:

我想建立其中RootViewController的對象管理兩個子視圖,一個iPhone應用程序其中之一應該對用戶搖晃他的iphone做出反應。

經過一番挖掘,我總結出子視圖必須在其視圖控制器的viewDidAppear方法中作出firstResponder。此外,canBecomeFirstResponder方法應修改爲返回YES。

所以這裏發生了什麼:我實例化應用程序委託中的rootviewcontroller。在它的viewDidLoad方法中,我告訴它addSubView firstViewController。所有這些都很好用。

但是,firstViewController不會對任何抖動做出反應。我灑了一些NSLogs,發現雖然我們告訴firstBeanController在canBecomeFirstResponder中返回YES,而我們告訴它在viewDidAppear中[self becomeFirstResponder],實際上,它是而不是 firstResponder。

所以,我的問題是: 1)做一個子視圖實際上需要firstResponder才能對抖動做出反應? a)如果沒有,如何讓一個子視圖沒有被firstResponder反應? 2)如何做一個subview firstResponder?

是什麼讓這個有趣的是,如果我執行相同的序列(canBecomeFirstResponder,[self firstResponder],motionBegan :)在一個不同的項目中只有一個視圖控制器,它完美地工作。很明顯,我必須遇到我自己製造的設計缺陷。

感謝,

mbotta

回答

1

不是100%肯定,但是這可能是你的問題。如果我們能看到有問題的方法,可能會更容易。

Event Handling Best Practices(重點由我加的):

如果您在 的UIView,UIViewController的,或者(在極少數 例)UIResponder的子類處理事件,

  • 你應該實現所有的事件處理方法(即使它是 null實現)。
  • 不要調用方法的超類實現。

如果你調用父類方法的事件很可能相處的nextResponder通過。上述

編輯

Event Handling Best Practices鏈接已經死了。我無法在任何地方找到該報價,但Event Handling Guide for UIKit Apps似乎是最相關的。

+0

謝謝!我會看看我可以在我的項目中做到這一點。同時,我會重新編輯我的問題,以澄清我能夠得到這個事件,如果firstViewController是唯一的視圖控制器。 – mbotta 2009-11-10 14:55:33