2012-12-04 17 views
2

我是新來的Objective-C很抱歉,如果這是一個新手的問​​題。 我搜索了幾個小時,似乎無法找到我的問題的答案。執行選擇找到的UIImageView使用級聯的NSString

所以我試圖訪問一個UIImageView,所以我可以隱藏/取消隱藏它通過串聯字符串來獲得應該隱藏/取消隱藏的UIImageView的名稱。

我把它做的工作:

self.faceItemEyesFrightened.hidden = false; 

然而這個名字的害怕部分每一個按鈕被點擊所以時間可能會有所不同,試圖重構我的代碼運行它返回一個函數UIImageView的類型應該受到影響。

所以,我有以下幾點:

NSString *fullEmotionString = [@"faceItemEyes" stringByAppendingString:emotionIs]; 

其中emotionIs害怕,因此形成

faceItemEyesFrightened 

所以,當我想這樣做我的問題就來了:

self.fullEmotionString.hidden = false; 

很明顯,這不是正確的做法,但我不知道應該如何做,任何建議不勝感激。 乾杯!

回答

0

您可以使用NSSelectorFromString這樣的:

SEL selector = NSSelectorFromString(fullEmotionString); 
UIImageView *imageView = [self performSelector:selector]; 
imageView.hidden = NO; 

注意,這需要一個名爲faceItemEyesFrightened被定義getter方法,通常這種情況下,如果你使用性質並沒有改變的名稱訪問器。

話雖這麼說,我覺得這不是你的問題的最佳解決方案。 你可以例如子類UIImageView並添加描述圖像中的情感的enum MyImageViewEmotion。接着,而是採用大量的變量,如faceItemEyesFrightenedfaceItemEyesHappy,你可以把所有的人都在一個簡單的數組,然後得到這樣的其中之一:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.emotion == %ld", 
          MyImageViewEmotionFrightened]; 
MyImageView *imageView = [eyeImageViews filteredArrayUsingPredicate:predicate][0] 

使用NSDictionary中,你把情感字符串作爲鍵和圖像視圖作爲值。然後,你可以很容易地訪問它們:

UIImageView *imageView = emotionViewDictionary[@"Frightened"]; 

順便說一句,在Objective-C布爾值被稱爲YESNO,而不是truefalse

+0

完美:)感謝您的快速響應。它提出警告'PerformSelector可能會導致泄漏,因爲它的選擇器是未知的'然而[這篇文章](http://stackoverflow.com/questions/10793116/to-prevent-warning-from-performselect-may-cause -a-leak-because-its-selector-is)處理這個問題。再次感謝! – Martin

+0

不客氣。我爲您的問題添加了一些替代建議。 – DrummerB