2014-10-02 62 views
2

我有UIView的子類,它嘗試使用以下方法調用在重置操作期間清理子視圖。iOS8「在調用本地Apple方法時沒有在選擇器中實現選擇器的方法」

[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

這是一個Apple方法,在Apple的UIView屬性上調用。 爲什麼我看到關於選擇器未在翻譯單元中實現的方法的這種神祕的警告?我不是在項目中使用任何斯威夫特,所以應該沒有需要翻譯什麼...

​​

更多代碼(working with THPinViewController code)THPinNumPadView.h文件:

// 
// THPinNumPadView.h 
// THPinViewControllerExample 
// 
// Created by Thomas Heß on 20.4.14. 
// Copyright (c) 2014 Thomas Heß. All rights reserved. 
// 
#import <UIKit/UIKit.h> 

@class THPinNumPadView; 

@protocol THPinNumPadViewDelegate <NSObject> 

@required 
- (void)pinNumPadView:(THPinNumPadView *)pinNumPadView numberTapped:(NSUInteger)number; 

@end 

@interface THPinNumPadView : UIView 

@property (nonatomic, weak) id<THPinNumPadViewDelegate> delegate; 
@property (nonatomic, assign) BOOL hideLetters; 

- (instancetype)initWithDelegate:(id<THPinNumPadViewDelegate>)delegate; 

@end 

THPinNumPadView。米的文件:

#import "THPinNumPadView.h" 
#import "THPinNumButton.h" 

@interface THPinNumPadView() 

@property (nonatomic, assign) CGFloat hPadding; 
@property (nonatomic, assign) CGFloat vPadding; 

@end 

@implementation THPinNumPadView 

- (instancetype)initWithDelegate:(id<THPinNumPadViewDelegate>)delegate 
{ 
    self = [self init]; 
    if (self) 
    { 
     _delegate = delegate; 
    } 
    return self; 
} 

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     _hPadding = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 24.0f : 20.0f; 
     _vPadding = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 19.0f : 13.0f; 

     [self setupViews]; 
    } 
    return self; 
} 

- (void)setupViews 
{ 
    // remove existing views 
    //Compiler warning here 
    [self.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)]; 

    NSMutableString *vFormat = [NSMutableString stringWithString:@"V:|"]; 
    NSMutableDictionary *rowViews = [NSMutableDictionary dictionary]; 

//... more setup code 
} 

回答

0

它發生而用於構建設置:

GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES // -Wselector 

只是禁用這個版本的設置和問題將得到解決。

我覺得這個問題應該由蘋果

+0

這完全錯了。這個警告有時會有誤報,但是你也扔掉了正確的警告。 cbowns可以正確回答工作而不會丟棄有效的警告。 – gnasher729 2016-12-08 16:53:00

1

Translation units不相關的夫特,它們指的是輸入到C(Objec在這種情況下tive-C)編譯器。


不管怎樣,我想你的代碼,並沒有產生警告我。請確保您從您調用此方法的文件獲得子類頭文件#import,並確保您正確地繼承了UIView而不是NSObject


如果這不能解決問題,哪個文件正在調用這一行?發佈更多的代碼,這可能有助於發現問題。此外,嘗試創建一個新的香草iOS項目,並調用該項目中的方法,看看它是否也觸發警告。

+0

我增加了更多的代碼。這是一個UIView子類,我檢查了子類和導入。 – 2014-10-02 18:06:06

+0

這真的很奇怪。你可以嘗試用'@import UIKit;'替換'#import '?不知道這是否有幫助。 – 2014-10-02 19:46:31

4

在某些情況下是固定的,這是Xcode中拋出一個假陽性警告。 (見Brent's OpenRadar for this issue)。

您可以用clang pragma抑制它:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wselector" 
      <#code#> 
#pragma clang diagnostic pop 

(我對上面的剪貼板片段,它的A +真棒。)