Доступ к методу из других классов Objective-C - PullRequest
19 голосов
/ 02 ноября 2009

Искал ответ на этот вопрос, но я еще не нашел подходящего. Я надеюсь, что вы, ребята (и девочки), можете мне помочь! (Это для приложения для 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

Я чувствую, что мне нужно # импортировать другой файл, создать объект из класса и вызвать метод из объекта ... Как мне это сделать?

Еще раз спасибо!

Ответы [ 8 ]

26 голосов
/ 02 ноября 2009

Вариант 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 в ваших контроллерах вида ..

6 голосов
/ 02 ноября 2009

Здесь есть несколько ответов, говорящих вам о создании общего «родительского» класса. Однако я думаю, что вы можете сделать намного лучше. Вместо этого создайте категорию для UIViewController. Вы не знаете все, что происходит с UIViewController, поэтому я не думаю, что стоит создавать собственную иерархию View Controller. На самом деле это может быть опасно. Я столкнулся с рядом проблем, когда попытался создать «базовый» UITableViewController, а затем создать классы, которые наследуют его. Я избежал этих проблем, используя вместо этого категории.

Ваш приоритет № 1 не должен наследовать вещи без уважительной причины, это должно быть получение приложения в магазине приложений, которое люди захотят скачать.

3 голосов
/ 02 ноября 2009

То, что вы хотите сделать, это заставить два контроллера совместно использовать общий суперкласс:

UIViewController : MyAwesomeViewController : ViewController1
                                           : ViewController2

commonMethod: будет находиться в MyAwesomeViewController. Кроме того, не начинайте имена методов с заглавных букв. :)

Для уточнения:

+@interface MyAwesomeController : UIViewController {

-@interface ViewController1 : UIViewController { // and ditto for ViewController2
+@interface ViewController1 : MyAwesomeController {
3 голосов
/ 02 ноября 2009

Мне кажется, что обычный код вообще не должен быть в классе. Есть ли причина, по которой вы не можете просто использовать функцию в стиле C для того, что вы хотите сделать?

Вы можете поместить общий код в класс, а затем сделать два других ваших подкласса этого класса; этот метод также позволяет избежать дублирования кода.

Другим вариантом может быть написание метода класса вместо методов экземпляра для этого общего кода. Я думаю, что большинство людей считают, что синглетонов лучше избегать при выборе дизайна.

Было бы легче дать хороший ответ, если бы мы знали больше о том, чего вы действительно пытались достичь.

1 голос
/ 02 ноября 2009

Передавайте ссылку на ваш commonClass, когда вы выделяете и запускаете ваши представления ...

CommonClass *cc = [[CommonClass alloc] init];

ViewController1 *vc1 = [[ViewController1 alloc] ... initWith:cc];
ViewController2 *vc2 = [[ViewController2 alloc] ... initWith:cc];

но может быть достаточно классического включения c.

1 голос
/ 02 ноября 2009

Имейте в виду, что Objective-C - это просто расширенный набор C, и хотя директивы #include в основном используются для заголовочных файлов, ничто не мешает вам использовать #include для встраивания содержимого одной реализации в другую реализацию. Если код действительно идентичен, вы можете просто вставить его в отдельный файл и #include в файл .m.

Сказав, что, возможно, было бы лучше использовать этот метод в сочетании с категориями, особенно если одна и та же реализация имеет аналогичное поведение.

0 голосов
/ 27 августа 2013

Еще один метод, который вы можете использовать

@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.

0 голосов
/ 05 апреля 2013

Как новичок iPhone с фоном Java и небольшим Си, у меня была похожая проблема, когда я хотел сослаться на метод в RootController и ViewController. Мне показалось, что подходящим местом для метода является класс AppDelegate, экземпляр которого можно получить в других классах следующим образом:

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

тогда, если метод "doSomething", доступ к нему осуществляется следующим образом:

[delegate doSomething];

Но, возможно, это слишком очевидно или не то, что требовалось.

...