2009-11-01 2 views
19

Ищет ответ на этот вопрос, но пока не нашел подходящего. Я надеюсь, что вы, ребята (и девочки), можете мне помочь! (Это приложение для iPhone)Доступ к методу из других классов Цель-C

Хорошо, у меня есть приложение 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 

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

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

ответ

26

Вариант 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: использование наследования (см описание г Totland в этой теме)

@implementation commonClass 
- (void)CommonMethod:(id)sender 
{ 
//So some awesome generic stuff... 
    } 
@end 

/* in your .h file */ 
@interface ViewController2: commonClass 

@end 

естественно, вы всегда должны до #import commonClass.h на ваш взгляд контроллеры ..

+0

Привет, что такое класс суперкласса commonClass? Я имею в виду, что у меня есть один метод, который мне нужно вызвать из разных классов, так что для него лучше всего подходит? –

+0

Является ли '[свойство release]' разрешенным в режиме ARC? Компилятор говорит мне, что это запрещено. – tymac

+0

@tymac Этот пост с 2009 года, до ARC. –

3

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

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

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

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

+0

Кажется, что проблема не связана с наследованием. –

+0

Спасибо. У меня был метод (method1) в Class1. Я объявил его в Class1.h и реализовал в Class1.m. У меня есть Class2, и у него есть селектор: @selector (method1). В этом случае, как я могу это сделать? –

+1

@ Виллихам, вот как это звучит. @srikanth, может быть, вам нужно задать вопрос, а не просто разместить комментарий здесь? –

3

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

UIViewController : MyAwesomeViewController : ViewController1 
              : ViewController2 

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

Выработать:

[email protected] MyAwesomeController : UIViewController { 

[email protected] ViewController1 : UIViewController { // and ditto for ViewController2 
[email protected] ViewController1 : MyAwesomeController { 
+0

+1 Наследование - путь. –

1

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

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

1

Pass в ссылке на ваш commonClass когда вы Alloc и INIT свои взгляды ...

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

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

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

6

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

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

+0

+1 для окончательного ... –

0

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

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

тогда, если метод «йоЗотеЬЫпд» один получает доступ к ней через:

[delegate doSomething]; 

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

0

Другой метод, который вы можете использовать

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