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

tôi thấy mã này trong câu trả lời của câu hỏi khác (How to disable touch input to all views except the top-most view?) và nó làm tôi ngạc nhiên khi nó làm việc, như setUserInteractionEnabled: hy vọng một BOOL (mà vì nó không phải là một đối tượng mục tiêu-c không thể được thông qua trong performSelector:withObject: phương pháp loại).Làm cách nào để vượt qua NSNumber với một phương thức mong đợi một bool?

Tài liệu nói rằng vượt qua NSNumber ở đâu là ok? Nó có hoạt động cho tất cả các phương pháp, hay là một thực hiện đặc biệt cần thiết? Và nó chỉ làm việc với BOOL, hoặc nó có thể được thực hiện với các loại như int?

+0

[Tìm kiếm này] (http://www.google.com/search?q=performSelector:withObject%20nsnumber) sẽ trả về nhiều kết quả của những người đang thử những thứ tương tự, nhưng tôi không thấy điều này được đề cập đến một giải pháp, và tôi không thấy nó có thể hoạt động như thế nào. – Douglas

+0

Bạn đang nói bạn đã thử điều này và nó hoạt động, hoặc bạn đã thấy ai đó nói rằng nó hoạt động? – jrturton

+0

@jrturton, hai người nói nó hoạt động và nó có hiệu quả mong muốn khi tôi thử nó, nhưng tôi nghĩ rằng tôi biết những gì đã xảy ra ... –

Trả lời

3

Nếu bạn chỉ muốn mã của bạn hoạt động, hãy upvote và chấp nhận câu trả lời của Paul.s. Nếu bạn muốn đọc về các nerds thực hiện các thí nghiệm, hãy tiếp tục. Có một số cuộc thảo luận thú vị trong các ý kiến ​​cho câu trả lời ban đầu của tôi mà tôi đã tóm tắt dưới đây.

Điều này không có tác dụng. Tôi đã thử nó trong một dự án iOS, thuộc tính userInteractionEnabled không bị ảnh hưởng bởi việc gửi performSelector:withObject:. Điều này phù hợp với số documentation cho NSObject nêu rõ:

aSelector phải xác định một phương pháp lấy một đối số duy nhất của id loại. Đối với các phương thức với các kiểu đối số khác và các giá trị trả về, hãy sử dụng NSInvocation.

Bây giờ huyền thoại Peter Hosey xây dựng một công cụ nền tảng mẫu here hoạt động hiệu quả khi bạn vượt qua gấp đôi, cũng nổi như tôi đã phát hiện ra.

Để thêm sự tò mò vào sự tò mò, điều này không hoạt động trong dự án iOS (đôi hoặc nổi).

Nói tóm lại, tôi nghĩ rằng chúng ta có thể nói như sau:

  • Nếu nó bao giờ hoạt động, nó hoạt động một cách tình cờ và không nên dựa vào
  • Một chấp nhận hoặc bỏ phiếu tán câu trả lời trên stack overflow không nhất thiết phải chính xác
+0

Tài liệu đó có ở bất kỳ đâu không? Tôi biết nó là tài liệu cho KVC, nhưng còn về 'performSelector: withObject:' và bạn bè thì sao? –

+0

Tôi không biết, tôi đang dùng từ ngữ của người hỏi vì nó hoạt động, tôi không thể tự kiểm tra bản thân vào lúc này. – jrturton

+1

Điều này không hiệu quả đối với tôi trên 10.7.2 với 'BOOL' (báo cáo -64 thay vì 0), nhưng đáng ngạc nhiên * làm * hoạt động với' double'. –

2

Bạn không thể chuyển NSNumber làm đối tượng và để nó trở thành BOOL ở đầu kia như thế. Tuy nhiên, có một số cách giải quyết.

  1. Sử dụng NSInvocation. Bạn cần tạo một thể loại NSArray sử dụng NSInvocation. Đây là một chút lộn xộn.

  2. Tạo danh mục UIView với setUserInteractionEnabled: -như chức năng (có tên tương tự?) Hoạt động với NSNumber sau đó gọi setUserInteractionEnabled: với giá trị BOOL của NSNumber. Một cái gì đó như:

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

Tôi nghĩ bạn đã đi đến kết luận rằng điều này không làm việc.

@senojsitruc gợi ý một vài cách khác nhau để làm việc đó nhưng nhìn ra giải pháp dễ nhất

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

Các tài liệu cho NSArray nhà nước:

setValue: forKey:

gọi setValue: forKey: trên mỗi mục của mảng sử dụng giá trị và khóa được chỉ định.

Các vấn đề liên quan