Подтвердить что ты не робот

Доступ к методу из других классов 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

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

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

4b9b3361

Ответ 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.