2012-12-12 33 views
1

我讀過的蘋果文檔的responder chain,並知道需要:它是怎麼做我的NSLog這是在竊聽對象?有什麼辦法可以在Objective C中使用get對象嗎?

比方說,我有一個非常複雜的視圖控制器與多個視圖對象,當我點擊一個對象(UIButton或什麼是..)有沒有辦法知道被挖掘的特定對象? 該文檔給出了一個很好的概述,但不清除覆蓋的方法。

編輯: 這種情況是在測試我沒有寫的不同的應用程序。我需要一種快速的方法來確定所用的對象(許多應用程序都有自定義控件/對象,看起來像是一件事,但實際上是另一件事)。我希望有一些方法可以在發送到UIAppication時截獲觸摸事件,然後NSLog。

+1

您需要響應水龍頭的方法。他們每個人都可以確定是什麼導致了自來水。 (如果你需要知道事件處理結束後,你可以創建一些'id lastTapTarget'變量並保存它。) –

+0

根據文檔,它說事件對象首先被髮送到UIApplication,然後到窗口,然後到視圖。在到達那裏時是否有辦法攔截這些事件?我不想開始在一個應用程序中爲一堆對象編寫自來水方法,我不擁有 –

+0

您如何看待這個問題?有幾種方法可以回答你的問題。對於UIControl子類,您可以始終定義在進行特定觸摸時調用的操作。如果你只是按照觸摸事件,那麼你可能需要得到沙發的座標,並確定哪個UIView當前佔用的空間。有更多的選擇。真的,這取決於。請爲您的情況提供更多背景。 –

回答

4

您可以覆蓋-[UIApplication sendAction:to:from:forEvent]做你想要什麼:

@implementation MyApplicationSubclass 

- (BOOL)sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event 
{ 
    NSLog(@"Sending action %@ from sender %@ to target %@ for event %@", NSStringFromSelector(action), sender, target, event); 
    return [super sendAction:action to:target from:sender forEvent:event]; 
} 

@end 

將在UIApplication的自定義子類。然後,在main.m文件,以便使用您的自定義子類的調用更改爲UIApplicationMain():使用此機制這隻適用於UIControl子類,其中發送他們的行動對他們的目標

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, NSStringFromClass([MyApplicationSubclass class]), NSStringFromClass([AppDelegate class])); 
    } 
} 

注意。如果您想查看所有通過應用的觸摸事件,請改爲使用-[UIApplication sendEvent:]。在這種情況下,將由您決定哪個對象要去接收觸摸。您可以通過在您的主視圖/窗口上調用-hitTest:來做到這一點,但請記住,它指出觸摸着陸的視圖,而不一定是哪個視圖處理它(視圖可以將事件轉發給其他對象)。例如:

@implementation MyApplicationSubclass 

- (void)sendEvent:(UIEvent *)event 
{ 
    UIWindow *window = [self keyWindow]; 
    NSSet *touches = [event touchesForWindow:window]; 
    for (UITouch *touch in touches) { 
     UIView *touchedView = [window hitTest:[touch locationInView:window] withEvent:event]; 
     NSLog(@"Touch %@ received in view %@ for event %@", touch, touchedView, event); 
    } 

    [super sendEvent:event]; 
} 

@end 
+0

天才。謝謝!我修改我的代碼只是一點點,但這應該很好:) –

1

對於按鈕的動作方法通常具有PARAM,

- (void)action:(id)sender { 

這裏發件人表示該按鈕。您可以使用它作爲,

UIButton *button = (UIButton *)sender; 
    button.hidden = YES;//use the properties of button now 

您還可以使用UITouch delegate方法檢查。

對於如: -

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
     UITouch *myTouch = [[event allTouches] anyObject];// or UITouch *touch = [touches anyObject]; 

     CGPoint point = [myTouch locationInView:myViewToCheck]; 
     if (CGRectContainsPoint(myViewToCheck.bounds, point)) { 
      //Touch detected on myViewToCheck. 
     } 
+0

這是對的。我只是不認爲這是他所要求的。 –

+0

好的。它不僅僅是一個按鈕..有沒有辦法有能力記錄在屏幕上點擊的任何控制?這些控件可以是字面上的任何形式,包括所有形式的自定義控件。 –

+0

@HermannKlecker,是嗎?對不起,我想我對這個問題感到困惑。讓我再檢查一次。 – iDev

0

有你有機會來看看https://github.com/domesticcatsoftware/DCIntrospect

直從GitHub:反思是針對iOS小的工具集,有助於調試與UIKit中內置的用戶界面。

它有一個記錄組件,可能是使用的?

+0

這對於需要的任務來說有點矯枉過正。我雖然保存了該鏈接。謝謝。 –

相關問題