Доступ к методу из других классов Objective-C
Посмотрел ответ на этот вопрос, но пока не нашел подходящего. Я надеюсь, что вы, ребята (и девочки), можете мне помочь! (Это приложение для iPhone)
Хорошо, у меня есть приложение Mutliview. У каждого вида есть свой класс, и все счастливо. Однако разные классы иногда называют один и тот же метод. До сих пор я просто написал этот метод дважды в обоих файлах классов.
Это то, что я хочу сделать, хотя:
Я хочу создать новый класс в его собственном файле, который имеет все "общие" методы. Затем, когда другой класс должен вызвать метод, я просто вызываю его из другого файла. Таким образом, когда я хочу изменить метод, мне нужно только изменить его в одном месте, а не во всех местах...
Я не уверен, как я это сделаю, поэтому я прошу о помощи. Я немного ржавый и новый для Objective-C, поэтому красивые примеры мне очень помогут. Позвольте мне дать вам один.
Файл: ViewController1.m
@implementation ViewController1
//Do Some awesome stuff....
CALL "CommonMethod" HERE
@end
Файл: ViewController2.m
@implementation ViewController2
//Do Some awesome stuff....
CALL "CommonMethod" HERE
@end
Файл: CommonClass
@implementation commonClass
- (void)CommonMethod:(id)sender
{
//So some awesome generic stuff...
}
@end
Мне кажется, что мне нужно # импортировать другой файл, сделать объект из класса и вызвать метод из объекта... Как это сделать?
Еще раз спасибо!
Ответы
Ответ 1
Вариант 1:
@implementation commonClass
+ (void)CommonMethod:(id)sender /* note the + sign */
{
//So some awesome generic stuff...
}
@end
@implementation ViewController2
- (void)do_something... {
[commonClass CommonMethod];
}
@end
Вариант 2:
@implementation commonClass
- (void)CommonMethod:(id)sender
{
//So some awesome generic stuff...
}
@end
@implementation ViewController2
- (void)do_something... {
commonClass *c=[[commonClass alloc] init];
[c CommonMethod];
[c release];
}
@end
Вариант 3: используйте наследование (см. описание г-на Тотленда в этом потоке)
@implementation commonClass
- (void)CommonMethod:(id)sender
{
//So some awesome generic stuff...
}
@end
/* in your .h file */
@interface ViewController2: commonClass
@end
естественно, вам всегда нужно #import commonClass.h
в контроллерах вашего вида.
Ответ 2
Здесь есть несколько ответов, в которых вам сообщается о создании общего "родительского" класса. Однако я думаю, что вы можете сделать намного лучше. Создайте категорию для UIViewController. Вы не знаете всех внутренних дел о том, что происходит с UIViewController, поэтому я не думаю, что стоит создать собственную иерархию View Controller. На самом деле это может быть опасно. Я столкнулся с рядом проблем, когда пытался создать "базовый" UITableViewController, а затем создавать классы, которые наследуют от этого. Я избегал этих проблем, используя вместо них категории.
Ваш приоритет №1 не должен наследовать вещи без уважительной причины, он должен получать приложение в хранилище приложений, которое люди захотят загрузить.
Ответ 3
Мне кажется, что обычный код не обязательно должен быть в классе. Есть ли причина, по которой вы не можете просто использовать функцию C-стиля для того, что вы хотите сделать?
Вы можете поместить общий код в класс, а затем сделать свои другие два класса подклассами этого; этот метод также позволяет избежать дублирования кода.
Другой вариант может заключаться в том, чтобы написать метод класса вместо методов экземпляра для этого общего кода. Я думаю, что большинство людей считают, что лучше всего избегать одиночных игр в качестве дизайна.
Было бы легче дать хороший ответ, если бы мы знали больше о том, чего вы действительно пытались выполнить.
Ответ 4
Что вы хотите сделать, так это сделать, чтобы два контроллера имели общий суперкласс:
UIViewController : MyAwesomeViewController : ViewController1
: ViewController2
commonMethod:
будет затем находиться в MyAwesomeViewController. Кроме того, не начинайте имена методов заглавными буквами.:)
Разработать:
[email protected] MyAwesomeController : UIViewController {
[email protected] ViewController1 : UIViewController { // and ditto for ViewController2
[email protected] ViewController1 : MyAwesomeController {
Ответ 5
Имейте в виду, что Objective-C является просто надмножеством C, и что директивы #include в основном используются для файлов заголовков, там ничего не мешает вам использовать #include для встраивания содержимого одной реализации в другую реализацию. Если код действительно идентичен, вы можете просто просто вставить его в свой собственный файл и # включить его в файл .m.
Сказав это, возможно, было бы лучше использовать эту технику в сочетании с категориями, особенно если такая же реализация имеет подобное поведение.
Ответ 6
Передайте ссылку на ваш commonClass, когда вы выделяете и запускаете свои представления...
CommonClass *cc = [[CommonClass alloc] init];
ViewController1 *vc1 = [[ViewController1 alloc] ... initWith:cc];
ViewController2 *vc2 = [[ViewController2 alloc] ... initWith:cc];
но сделать классический c include может быть достаточно.
Ответ 7
Как неофит iPhone с фоном Java и небольшим C, у меня была аналогичная проблема, желающая обратиться к методу как в RootController, так и в ViewController. Мне показалось, что подходящим местом для метода был класс AppDelegate, экземпляр которого можно получить в других классах:
MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
то если метод "doSomething", он обращается к нему:
[delegate doSomething];
Но, возможно, это слишком очевидно или не требуется.
Ответ 8
Другой метод, который вы можете использовать
@interface ServerManager : NSObject
+(ServerManager *)getInstance;
@implementation ServerManager
+(ServerManager *)getInstance
{
static ServerManager *objServerManager = nil;
if(objServerManager==NULL){
objServerManager=[[self alloc] init];
}
// Return the servermanager object.
return objServerManager;
}
Вызов Если вы хотите использовать
ServerManager *SMObject = [ServerManager getInstance];
Не забудьте импортировать файл servermanager.h.