简体   繁体   English

将自定义对象导入多个文件

[英]Importing custom objects into multiple files

I am having a bit of a problem with importing custom objects into my viewController. 我在将自定义对象导入到viewController时遇到了一些问题。

I have created a Message Object that holds the json response from the server. 我创建了一个消息对象,其中包含来自服务器的json响应。 I then created a MessageManager class, that does all of the network calls to the API. 然后,我创建了一个MessageManager类,该类对API进行所有网络调用。

MessageManager imports Message, to create the message object and pass it off to whatever class is using it. MessageManager导入Message,以创建消息对象并将其传递给正在使用它的任何类。

I now have my viewController class, which #import both MessageManager and Message. 现在,我有了viewController类,该类同时导入MessageManager和Message。 so I can create an instance variable of Message. 因此我可以创建Message的实例变量。 However I run into duplicate symbol errors with the compiler. 但是我在编译器中遇到重复的符号错误。

How do I get around this issue, and have the correct sequence of imports. 如何解决此问题,并具有正确的导入顺序。

If i remove the Message.h from the viewcontroller, and remove any code referencing Message, it compiles normally. 如果我从视图控制器中删除Message.h,并删除任何引用Message的代码,它将正常编译。

Messages.h Which is returned by JSONModel and parses json object Messages.h由JSONModel返回并解析json对象

#import <JSONModel/JSONModel.h>

@protocol Messages;
@interface Messages : JSONModel
@property (nonatomic) NSString<Optional>* id;
@property (nonatomic) NSString<Optional>* sender_id;
@property (nonatomic) NSString<Optional>* receiver_id;
@property (nonatomic) NSString<Optional>* user_user_id;
@property (nonatomic) NSString<Optional>* job_id;
@property (nonatomic) NSString<Optional>* file_id;
@property (nonatomic) NSString<Optional>* title;
@property (nonatomic) NSString<Optional>* replied;
@end






@protocol MessagesModel;
@interface MessagesModel : JSONModel
@property (nonatomic) NSString<Optional>* action;
@property (nonatomic) NSDate<Optional>* dateTime;
@property (nonatomic) NSString<Optional>* result;
@property (nonatomic) NSString<Optional>* numItems;
@property (nonatomic) NSArray <Messages>  *items;
@end

@implementation MessagesModel
+ (JSONKeyMapper *)keyMapper
{
    return [JSONKeyMapper mapperForSnakeCase];
}
@end

MessageViewController.h MessageViewController.h

#import <UIKit/UIKit.h>

@interface MessagesViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@property (strong, nonatomic) UISearchController *searchController;


@end

MessageViewController.m MessageViewController.m

#import "MessagesViewController.h"
#import "MessageTableViewCell.h"
#import "MessageThreadViewController.h"
#import "Messages.h" <--Need Messages Object to use Object and pass object around
#import "MessageManager.h"

@interface MessagesViewController () <UISearchBarDelegate, UISearchResultsUpdating, UIActionSheetDelegate, UISearchControllerDelegate>

@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (strong, nonatomic) NSArray *inbox;
@property (strong, nonatomic) NSArray *sent;
@property (strong, nonatomic) NSArray *deleted;
@property (strong, nonatomic) NSArray *temp;
@property (assign, nonatomic) NSInteger selectedBox;
@property (assign, nonatomic) NSInteger selectedMessage;
@property (strong, nonatomic) MessageManager *messageManager;
@property (weak, nonatomic) IBOutlet UISearchBar *searchbar;
@property (strong, nonatomic) Messages *messages;

@end

MessageManager.h MessageManager.h

#import <Foundation/Foundation.h>
@interface MessageManager : NSObject


- (void)getReceivedMessagesListForReceiverID:(NSString*)receiverID success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)getSentMessagesListForSenderID:(NSString*)senderID success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)getDeletedMessagesListForMemberID:(NSString*)memberID success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)searchReceivedMessagesListForReceiverID:(NSString*)receuverID andKeyword:(NSString*)keyword success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)searchDeletedMessagesListForMemberID:(NSString*)memberID andKeyword:(NSString*)keyword success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)unreadMessagesCountForReceiverID:(NSString*)receiverID success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)sendMessageToReceiverID:(NSString*)receieverID ToSenderID:(NSString*)senderID withTitle:(NSString*)title andMessage:(NSString*)message success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)markMessageRead:(NSString*)messageID success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)markMessageUnRead:(NSString*)messageID success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)receivedListCountForReceivedID:(NSString*)receivedID success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)deletedMessagesListCountForMemberID:(NSString*)memberID success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)searchReceivedListCountForReceiverID:(NSString*)receiverID andKeyword:(NSString*)keyword success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)searchSentListCountForSender:(NSString*)senderID andKeyword:(NSString*)keyword success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
- (void)searchDeletedListCountForMemberID:(NSString*)memberID andKeyword:(NSString*)keyword success:(void (^)(NSArray *success))success failure:(void (^)(NSError *error))failure;
@end

MessageManager.m MessageManager.m

#import "MessageManager.h"
#import "Constants.h"
#import <AFNetworking/AFNetworking.h>
#import "Messages.h" <--Need Messages Object to create Messages from response

@implementation MessageManager
...

Error 错误

duplicate symbol _OBJC_IVAR_$_MessagesModel._result in:
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessagesViewController.o
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessageManager.o
duplicate symbol _OBJC_IVAR_$_MessagesModel._items in:
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessagesViewController.o
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessageManager.o
duplicate symbol _OBJC_IVAR_$_MessagesModel._numItems in:
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessagesViewController.o
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessageManager.o
duplicate symbol _OBJC_CLASS_$_Messages in:
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessagesViewController.o
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessageManager.o
duplicate symbol _OBJC_METACLASS_$_Messages in:
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessagesViewController.o
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessageManager.o
duplicate symbol _OBJC_IVAR_$_Messages._deleted_by_sender in:
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessagesViewController.o
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessageManager.o
duplicate symbol _OBJC_IVAR_$_MessagesModel._action in:
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessagesViewController.o
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessageManager.o
duplicate symbol _OBJC_IVAR_$_Messages._receiver_login in:
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessagesViewController.o
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessageManager.o
duplicate symbol _OBJC_IVAR_$_Messages._sender_login in:
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessagesViewController.o
    /Users/anthonytaylor/Library/Developer/Xcode/DerivedData/Build/Intermediates/Voices.com.build/Debug-iphonesimulator/Voices.com.build/Objects-normal/x86_64/MessageManager.o
...

Based on the files you've mentioned in the question, you only have the Messages.h file in your project and do not have the Messages.m file, instead have the implementation declared in the header file, am I right? 根据您在问题中提到的文件,你只有Messages.h项目中的文件,并没有Messages.m文件,而不是已经落实在头文件中声明,对吗? I was able to replicate your duplicate symbols error on the example project I found here by copying the classes from your question. 通过复制问题中的类,我能够在这里找到的示例项目中复制重复的符号错误。 But when I created a Messages.m file with the implementation of both Messages and MessageManager classes, the duplicate symbols compiler error disappeared, and I was able to create an instance of the MessageManager class. 但是,当我使用MessagesMessageManager类的实现创建Messages.m文件时,重复的符号编译器错误消失了,并且我能够创建MessageManager类的实例。

With that said, I'm not sure what you mean by 话虽如此,我不确定你的意思是

The JSONModel tutorials all show doing the @implementation in the header, and not needing the .m files at all. JSONModel教程都显示在标头中执行@implementation,而根本不需要.m文件。

comment, but according to JSONModel's Github readme page , they say: 评论,但是根据JSONModel的Github自述页面 ,他们说:

There's no need to do anything in the implementation (.m) file. 无需在实现(.m)文件中做任何事情。

This probably doesn't mean that you don't need to have the .m file. 这可能并不意味着您不需要.m文件。 Its a good practice anyway to have both .h and .m files for a class since the Compile Sources option under the Build Phases tab of your Xcode project's target only has the .m files files. 无论如何,为一个类同时具有.h和.m文件是一个好习惯,因为Xcode项目目标的Build Phases选项卡下的Compile Sources选项只有.m文件文件。 This is what tells the compiler which source files should be compiled while building a target. 这告诉编译器在构建目标时应编译哪些源文件。 Since you declared the implementation inside the .h file, the compiler can't find it at build time. 由于您在.h文件中声明了实现,因此编译器在构建时找不到它。

Here's a screenshot of the example Xcode project I setup: 这是我设置的示例Xcode项目的屏幕截图:

Xcode项目设置的屏幕截图

MessageManager.h file MessageManager.h文件

#import <Foundation/Foundation.h>
@class MessagesModel;

@interface MessageManager : NSObject

+ (MessagesModel *)getMessages;

@end

MessageManager.m file: MessageManager.m文件:

#import "MessageManager.h"
#import "Messages.h" //<-- Imported here

@implementation MessageManager

+ (MessagesModel *)getMessages {
    NSError *error = nil;
    NSDictionary *dictionary = @{@"action": @"replied",
                                 @"dateTime": @"",
                                 @"result": @"success",
                                 @"numItems": @"1",
                                 @"items": @[@{@"id": @"1",
                                               @"sender_id": @"2",
                                               @"receiver_id": @"3",
                                               @"user_user_id": @"4",
                                               @"job_id": @"5",
                                               @"file_id": @"6",
                                               @"title": @"Hello world",
                                               @"replied" : @"7"}]};
    MessagesModel *messages = [[MessagesModel alloc] initWithDictionary:dictionary error:&error];
    if (error)
        NSLog(@"Oops!");

    return messages;
}

@end

Messages.h file: Messages.h文件:

#import <JSONModel/JSONModel.h>

@protocol Messages;
@interface Messages : JSONModel
@property (nonatomic) NSString<Optional>* id;
@property (nonatomic) NSString<Optional>* sender_id;
@property (nonatomic) NSString<Optional>* receiver_id;
@property (nonatomic) NSString<Optional>* user_user_id;
@property (nonatomic) NSString<Optional>* job_id;
@property (nonatomic) NSString<Optional>* file_id;
@property (nonatomic) NSString<Optional>* title;
@property (nonatomic) NSString<Optional>* replied;
@end


@protocol MessagesModel;
@interface MessagesModel : JSONModel
@property (nonatomic) NSString<Optional>* action;
@property (nonatomic) NSDate<Optional>* dateTime;
@property (nonatomic) NSString<Optional>* result;
@property (nonatomic) NSString<Optional>* numItems;
@property (nonatomic, strong) NSArray <Messages>  *items;
@end

Messages.m file: Messages.m文件:

#import "Messages.h"

@implementation Messages

@end

@implementation MessagesModel

+ (JSONKeyMapper *)keyMapper {
    return [JSONKeyMapper mapperForSnakeCase];
}

@end

ViewController.m file: ViewController.m文件:

#import "ViewController.h"
#import "MessageManager.h"
#import "Messages.h" //<-- Imported here

@interface ViewController ()

@property (strong, nonatomic) MessagesModel *messagesModel;
@property (weak, nonatomic) NSArray<Messages *> *messages;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.messagesModel = [MessageManager getMessages];
    self.messages = self.messagesModel.items;
    NSLog(@"%@", self.messages);
}

@end

And finally, the output: 最后,输出: LLDB输出

Let me know if you want me to upload the Xcode project in case you want to examine the setup. 让我知道是否要上传Xcode项目,以备检查设置。

Hope this helps. 希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM