Доступ к функции в другом классе

#iphone #objective-c

#iPhone #objective-c

Вопрос:

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

На данный момент я делаю это.

 // FunkBib.h

#import <Foundation/Foundation.h>


@interface FunkBib : NSObject {        
}
-(NSString *)formateraTillEEEEdMMMM:(id)suprDatum;
@end

// FunkBib.m

-(NSString *)formateraTillEEEEdMMMM:(id) suprDatum{        

    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    dateFormatter.dateFormat = @"yyyyMMdd";        

    NSDate *date = [dateFormatter dateFromString:suprDatum];        

    NSLocale *swedishLocale=[[[NSLocale alloc] initWithLocaleIdentifier:@"sv_SE"] autorelease];
    dateFormatter.locale=swedishLocale;        

    dateFormatter.dateFormat=@"EEEE d MMMM";
    NSString * weekdayString= [dateFormatter stringFromDate:date];

    NSString *newWeekDayString = [weekdayString stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[weekdayString substringToIndex:1] capitalizedString]];

    return newWeekDayString;        
}
  

Тем временем в других моих классах я делаю это.

 //someclass.h

#import <UIKit/UIKit.h>    

@class FunkBib;

@interface someclass : UIViewController {    

FunkBib *funkBib;

}
@property(nonatomic,retain)     FunkBib                         *funkBib;    
@end

// someclass.m

#import "FunkBib.h"    
@implementation someclass.m    
@synthesize funkBib;
  

И на более позднем этапе кода я хотел бы использовать эту функцию следующим образом.

 somelabel.text = [funkBib formateraTillEEEEdMMMM:[someArray objectAtIndex:somewhere]];
  

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

Кстати: код не скопирован, поэтому могут быть синтаксические ошибки.

Ответ №1:

создайте экземпляр для FunBib

-(void)viewDidLoad{ [super viewDidLoad]; self.funkBib=[[FunkBib alloc] init];
somelabel.text = [self.funkBib форматироватьeeedmmmm:[someArray objectAtIndex:somewhere]]; }

Комментарии:

1. Да, я делал это ранее. На данный момент я использую [funkBib formateraTillEEEEdMMMM] в нескольких местах кода, и я действительно не хочу создавать экземпляры funkbib везде, где я использую функцию. Могу ли я создать ее экземпляр один раз для всего класса?

2. Спасибо, мой дорогой добрый сэр. Я приму ответ, как только смогу.

Ответ №2:

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

  (NSString *)formateraTillEEEEdMMMM:(id) suprDatum{



    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    dateFormatter.dateFormat = @"yyyyMMdd";


    NSDate *date = [dateFormatter dateFromString:suprDatum];


    NSLocale *swedishLocale=[[[NSLocale alloc] initWithLocaleIdentifier:@"sv_SE"] autorelease];
    dateFormatter.locale=swedishLocale;


    dateFormatter.dateFormat=@"EEEE d MMMM";
    NSString * weekdayString= [dateFormatter stringFromDate:date];

    NSString *newWeekDayString = [weekdayString stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[weekdayString substringToIndex:1] capitalizedString]];

    return newWeekDayString;

}
  

назовите ее именем вашего класса

 [FunkBib formateraTillEEEEdMMMM:obj];
  

Комментарии:

1. Спасибо, я еще не знал о статических методах в obj-c.

2. В Objective-C. Они называются «методами класса».

Ответ №3:

Похоже, что вы пытаетесь манипулировать NSString здесь. Почему бы вам не попробовать создать категорию для NSString вместо создания этого объекта. Это означало бы, что вам не пришлось бы создавать этот объект каждый раз, когда вы хотите выполнить эту операцию над строкой. Plus намного более расширяем для будущих проектов.

Смотрите эту ссылку для создания категорий:http://macdevelopertips.com/objective-c/objective-c-categories.html

Если бы я создавал эту категорию, это выглядело бы примерно так

NSString formattedDate.h :

 @interface NSString (FormattedDate)
-(NSString *) formateraTillEEEEdMMMM;
@end
  

NSString formattedDate.m :

 @implementation NSString (FormattedDate)

-(NSString *)formateraTillEEEEdMMMM {

    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    dateFormatter.dateFormat = @"yyyyMMdd";

    NSDate *date = [dateFormatter dateFromString:self];

    NSLocale *swedishLocale=[[[NSLocale alloc] initWithLocaleIdentifier:@"sv_SE"] autorelease];
    dateFormatter.locale=swedishLocale;


    dateFormatter.dateFormat=@"EEEE d MMMM";
    NSString * weekdayString= [dateFormatter stringFromDate:date];

    NSString *newWeekDayString = [weekdayString stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[weekdayString substringToIndex:1] capitalizedString]];

    return newWeekDayString;
}
  

@end

Тогда можно было бы вызвать:

 NSString *formattedDate = [NSString formateraTillEEEEdMMMM:@"whatever"];
  

Намного приятнее 🙂

Комментарии:

1. Спасибо, я обязательно рассмотрю это!

2. @Da_smokes: Не забудьте поставить префиксы к названиям категории и методов внутри. DSFormattedDate и DSFormateraTillEEEEdMMMM .

Ответ №4:

Разве изменение - перед именем метода на не сделало бы его статическим методом, который затем вы могли бы вызывать «по классу» вместо «по экземпляру»?