2012-01-01 66 views
6
[[self.view.window subviews] makeObjectsPerformSelector:@selector(setUserInteractionEnabled:) withObject:[NSNumber numberWithBool:NO]]; 

我看到這個代碼,另一個問題的答案(How to disable touch input to all views except the top-most view?),它讓我感到驚訝的時候,它的工作,爲setUserInteractionEnabled:期望一個布爾(其中,因爲它不是一個Objective-C的對象不能在performSelector:withObject:類型的方法傳遞)。如何將NSNumber傳遞給期望bool的方法?

傳遞NSNumber的文檔在哪裏可以嗎?它適用於所有方法,還是需要特殊實現?它只適用於BOOL,還是可以使用類似int的類型?

+0

[This search](http://www.google.com/search?q=performSelector:withObject%20nsnumber)顯示了很多嘗試類似事情的人的結果,但我沒有看到這裏提到的一個解決方案,我不明白它是如何工作的。 – Douglas 2012-01-01 22:31:11

+0

你是說你已經試過這個,它可以工作,或者你看到有人說它有效嗎? – jrturton 2012-01-01 22:35:03

+0

@jrturton,有兩個人說,它的工作,它有我想要的效果,但我想我知道發生了什麼... – 2012-01-01 22:43:59

回答

3

如果你只是想讓你的代碼工作,upvote並接受Paul.s的答案。如果你想閱讀關於進行實驗的書呆子,繼續。在我對原始答案的評論中進行了一些有趣的討論,我在下面進行了總結。

這不起作用。我已經在iOS項目中嘗試過,userInteractionEnabled屬性不受發送performSelector:withObject:的影響。這符合了與documentation爲 NSObject的規定:

aSelector應該確定一個類型爲ID的一個參數的方法。對於具有其他參數類型和返回值的方法,請使用NSInvocation。

現在傳奇Peter Hosey構建了一個簡單的基礎工具here這bizzarely足夠的作品當你通過一個雙吧,也有浮動,因爲我發現了自己。

爲了增加好奇心,好奇心在iOS項目中不起作用(double或float)。

綜上所述,我認爲我們可以說以下內容:

  • 如果它沒有工作,它的工作原理是意外,不應當
  • 一個可以依靠接受或堆棧溢出upvoted答案是不一定正確
+0

這是記錄在任何地方嗎?我知道它是爲KVC記錄的,但是'performSelector:withObject:'和朋友呢? – 2012-01-01 22:36:25

+0

我不知道,我正在採取提問者的話來說,它的工作原理,我現在無法檢查自己。 – jrturton 2012-01-01 22:37:36

+1

這不適用於我在10.7.2上使用'BOOL'(它報告-64而不是0),但令人驚訝的是* *會使用'double'工作。 – 2012-01-01 22:53:38

2

你不能傳遞一個NSNumber作爲對象,並將它作爲另一端的BOOL出現。但是,有一些解決方法。

  1. 使用NSInvocation。您需要創建一個使用NSInvocation的NSArray類別。這有點凌亂。

  2. 使用setUserInteractionEnabled:類似函數(具有類似名稱?)創建一個UIView類別,該函數使用NSNumber進行操作,然後使用NSNumber的BOOL值調用setUserInteractionEnabled:。喜歡的東西:

    @implementation UIView (Additions) 
    - (BOOL)setUserInteractionEnabled2:(NSNumber *)aBool 
    { 
        self.userInteractionEnabled = [aBool boolValue]; 
    } 
    @end 
    
2

我想你已經得出結論,這是行不通的。

@senojsitruc提出了幾個做不同的方式,但俯瞰最簡單的解決

[self.view.window.subviews setValue:[NSNumber numberWithBool:NO] forKey:@"userInteractionEnabled"]; 

NSArray狀態的文檔:

的setValue:forKey:

調用setValue:forKey:使用指定的值和鍵對每個數組的項目進行設置。