2016-09-07 7 views
1

Существует много вопросов о доступе к «частному» (я слышу технически, что в сообщениях Obj-C отсутствует частный вопрос) Obj-C. И есть много вопросов, касающихся No visible @interface для SomeClass объявляет селектор «SomeMethod». Тем не менее, нет ни одного решения, которое касалось обоих.Objective C запускает «частный» метод, определенный в одном файле .mm из другого файла .mm

Так вот какой код. Example.h

#import <Cocoa/Cocoa.h> 

@interface Example : NSView 

@end 

Example.mm

#import "Example.h" 
@interface Example() 
- (void) printWordOne:(NSString*) firstWorld wordTwo:(NSString*) secondWord; 
@end 


@implementation Example 

- (void)drawRect:(NSRect)dirtyRect { 
    [super drawRect:dirtyRect]; 

    // Drawing code here. 
} 

- (void) printWordOne:(NSString*) firstWorld wordTwo:(NSString*) secondWord{ 
    NSLog(@"The two words are %@ %@", firstWorld, secondWord); 
} 

@end 

ViewController.h

#import <Cocoa/Cocoa.h> 
#import "Example.h" 
@interface ViewController : NSViewController{ 
    IBOutlet Example *example; 

} 

@end 

IBOutlet был подключен в раскадровке.

ViewController.mm

#import "ViewController.h" 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Do any additional setup after loading the view. 
    [example printWordOne:@"Hello" wordTwo: @"World"]; 
} 

- (void)setRepresentedObject:(id)representedObject { 
    [super setRepresentedObject:representedObject]; 

    // Update the view, if already loaded. 
} 

@end 

вопрос я имею с этим вызовом метода. [example printWordOne:@"Hello" wordTwo: @"World"];

Ошибка No visible @interface for 'Example' declares the selector 'printWordOne:wordTwo'

Мне нужен способ вызова этой функции, не объявляя его в файле Example.h. Если я #import Example.mm в моем ViewController.mm файле я получаю следующее:

duplicate symbol _OBJC_CLASS_$_Example in: 
    /path/Example.o 
    /path/ViewController.o 
duplicate symbol _OBJC_METACLASS_$_Example in: 
    /path/Example.o 
    /path/ViewController.o 
ld: 2 duplicate symbols for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Я знаю, используя class_copyMethodList я могу получить список методов и список этот метод из ViewController.mm. Но опять же есть способ выполнить этот метод.

Любая помощь была бы принята с благодарностью.

ответ

1

Вы можете просто объявить категорию Example класса с частным объявлением метода внутри ViewController.mm:

#import "ViewController.h" 

@interface Example() 
- (void) printWordOne:(NSString*) firstWorld wordTwo:(NSString*) secondWord; 
@end 

@implementation ViewController 
// ... 
@end 
+0

Спасибо Борис, я знал, что что-то просто не хватает. – user2517182