Как вызвать метод appdelegete в другом классе в iphone - PullRequest
0 голосов
/ 28 июня 2011

У меня есть база данных с 10 таблицами.Поскольку мне нужно получить доступ к этой базе данных в разных контроллерах представления, я должен объявить два метода, показанных ниже в каждом из них.Есть ли способ, которым я могу избежать этого, объявив эти методы в делегате приложения.Если да, как я могу использовать эти методы в разных классах?

- (NSString *) getWritableDBPath {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:DATABASE_NAME];
}

-(void)createEditableCopyOfDatabaseIfNeeded 
{
    // Testing for existence
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DATABASE_NAME];
    NSLog(@"%@",writableDBPath);

    success = [fileManager fileExistsAtPath:writableDBPath];
    if (success)
        return;

    // The writable database does not exist, so copy the default to
    // the appropriate location.
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath]
                               stringByAppendingPathComponent:DATABASE_NAME];
    success = [fileManager copyItemAtPath:defaultDBPath
                                   toPath:writableDBPath
                                    error:&error];
    if(!success)
    {
        NSAssert1(0,@"Failed to create writable database file with Message : '%@'.",
                  [error localizedDescription]);
    }
}

Ответы [ 5 ]

2 голосов
/ 28 июня 2011

в вашем контроллере представления прежде всего создайте переменную делегата

YourAppDelegate *appDelegate=(YourAppDelegate *)[[UIApplication sharedApplication]delegate];

, затем вы можете вызывать любые методы, которые вы определили в своем делегате, например [appDelegate methodName];

1 голос
/ 28 июня 2011

Это просто крики, которые нужно реализовать как отдельный контроллер с методами уровня класса. Я настоятельно рекомендую создать контроллер базы данных с таким определением:

@interface DatabaseController: NSObject  
    + (NSString *) getWritableDBPath ;
    + (void) createEditableCopyOfDatabaseIfNeeded  ;
@end 

Тогда в вашем коде используйте его так:

#import "DatabaseController.h"


NSString * somePath = [DatabaseController getWritableDBPath];

[DatabaseController createEditableCopyOfDatabaseIfNeeded];
0 голосов
/ 28 июня 2011

Вам необходимо определить протокол для этого класса и добавить переменную этого протокола к переменной-члену этого класса следующим образом:

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

Затем вы можете назначить делегат объектов в качестве делегата приложения и вызывать методы.

@protocol mySqlDelegate ;

@interface mySqlClass  {

    id <mySqlDelegate> delegate;
}
@property (nonatomic, assign) id <mySqlDelegate> delegate;
@end



@protocol mySqlDelegate 

- (void) delegateMethodsForThisClass;

@end
0 голосов
/ 28 июня 2011

сначала создайте общий экземпляр для appdelegate. в противном случае в файле constant.h создайте экземпляр типа

 mAppDelegate=(YourAppDelegate*)[[UIApplication sharedApplication] ];

, затем просто импортируйте constant.h , и вы можете использовать mAppdelegate в любом месте, поэтому с помощью этого вы можете легко вызвать

0 голосов
/ 28 июня 2011

Установите их как общедоступные, чтобы вы могли вызывать их с помощью []

Вам просто нужно поменять минус на +

+(void)createEditableCopyOfDatabaseIfNeeded;
...