2013-07-01 2 views
-2

У меня есть проблема, что я надеюсь, что вы можете мне помочь. У меня есть приложение с несколькими видами раскадровки, каждый из которых имеет отдельный диспетчер представлений. Я хочу иметь возможность использовать свой собственный класс во всех представлениях в раскадровке. Это сделает код в каждом viewcontroller более чистым, и все приложение будет легче отлаживать и т. Д. Класс будет содержать переменные и методы.Создание экземпляра класса в IOS 6

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

Поскольку большинство переменных и методов будут использоваться в разных представлениях и в разное время, я хотел бы отделить их все в отдельных файлах.

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

Любой вход очень оценен!

Спасибо за ваше время, чтобы прочитать это ...

SomeClass.h имеет следующий код:

#import <Foundation/Foundation.h> 

@interface SomeClass : NSObject 
{ 
NSString *dataOne; 
NSString *dataTwo; 
NSString *dataThree; 
} 

- (void) SetDataOne: (NSString*) dataOneReceived; 
- (void) SetDataTwo: (NSString*) dataTwoReceived; 
- (void) SetDataThree: (NSString*) dataThreeReceived; 
- (void) saveSomeData; 

@end 

SomeClass.m имеет следующий код:

#import "SomeClass.h" 

@implementation SomeClass 

- (void) SetDataOne: (NSString*) dataOneReceived { 
    dataOne = dataOneReceived; 
} 

- (void) SetDataTwo: (NSString*) dataTwoReceived { 
    dataTwo = dataTwoReceived; 
} 

- (void) SetDataThree: (NSString*) dataThreeReceived { 
    dataThree = dataThreeReceived; 
} 


- (void) saveSomeData { 
    // Here I do stuff with dataOne etc… 
} 



@end 

У SomeView.h есть следующее Код:

#import <UIKit/UIKit.h> 
#import "HeadViewController.h" 
#import "SomeClass.h" 


@interface SomeView : UIViewController 

// contains stuff not needed to show here 

- (IBAction)Done:(id)sender; 

@end 

SomeView.m имеет следующий код:

#import "SomeView.h" 
#import "SomeClass.h" 


@interface SomeView() 

@end 

@implementation SomeView 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    SomeClass *someClassObject = [[SomeClass alloc] init]; 
    // Do any additional setup after loading the view. 
} 

// Other standard methods omitted 


- (IBAction)Done:(id)sender { 

    [someClassObject SetDataOne: @”whatever text”]; 
    [someClassObject SetDataTwo: @”whatever text”]; 
    [someClassObject SetDataThree: @”whatever text”]; 
    [someClassObject SaveSomeData]; 

    Error Msg for all the above: ”Use of Undeclared Identifier ’someClassObject’ 
} 

@end 

Комментарий: Вы можете увидеть сообщение об ошибке я получаю в конце кода выше. Я понятия не имею, что я делаю неправильно. Я рассмотрел множество примеров того, как создавать классы и вызывать их, но не может показаться чем-то, что решает мою проблему. Кроме того, я вижу, что некоторые из них помещают «SomeClass * someClassObject = [[SomeClass alloc] init];» в «файл main.m». Если я правильно понял, этот файл загружается первым при запуске приложения. Если это так, то я не могу разместить его там, поскольку мне придется создавать экземпляры моего класса в нескольких разных представлениях и в другое время, чем при запуске приложения. Вот почему я поместил его в метод viewDidLoad.

+4

«этот файл является первым, который загружается при запуске приложения» - я предлагаю вам вернуться на один шаг и научиться хорошо, прежде чем пытаться погрузиться в развитие iOS. Файлы не загружаются, а функции вызываются, 'main()' является первым для этого. –

+1

Уточните свой вопрос и удалите ненужные фрагменты кода. В его нынешнем виде это вопрос, ведущий в никуда. – allprog

+0

Думаю, вам нужно найти несколько хороших книг по программированию. «Серфинг в Интернете в течение нескольких часов» - это не способ научиться программированию. –

ответ

0

someClassObject установлен внутри viewDidLoad и потому, что он нигде не хранятся внутри вида будут удалены в конце того самого метода

0

Вы должны добавить свой объект в интерфейсе раздела каждого файла заголовка, как это:

SomeView.h

#import <UIKit/UIKit.h> 
#import "HeadViewController.h" 
#import "SomeClass.h" 


@interface SomeView : UIViewController 
{ 
SomeClass *someClassObject; 
} 

// contains stuff not needed to show here 

- (IBAction)Done:(id)sender; 

@end 

Затем, когда вы инстанцируете someClassObject внутри ViewDidLoad будет сохраняться на протяжении этой точки зрения.

+0

Спасибо! Но это не работает, я получаю сообщение об ошибке msg «Нет видимых @interface для« TeeStat'declares селектор «SetClubHit» и т. Д. ... –

1

Пара мыслей:

  1. Вы сделали someClassObject локальная переменная метода viewDidLoad. Похоже, вы хотели сделать его переменной экземпляра класса (или, лучше, частным свойством класса, которое будет иметь переменную экземпляра, синтезированную для вас). Таким образом:

    @interface SomeView() 
    
    @property (nonatomic, strong) SomeClass *someClassObject; 
    
    @end 
    
    @implementation SomeView 
    
    - (void)viewDidLoad 
    { 
        [super viewDidLoad]; 
        self.someClassObject = [[SomeClass alloc] init]; 
    } 
    
    - (IBAction)done:(id)sender { 
    
        [self.someClassObject setDataOne: @"whatever text"]; 
        [self.someClassObject setDataTwo: @"whatever text"]; 
        [self.someClassObject setDataThree: @"whatever text"]; 
        [self.someClassObject saveSomeData]; 
    
        // should resolve the Error Msg for all the above: ”Use of Undeclared Identifier ’someClassObject’ 
    } 
    
  2. BTV, как вопрос конвенции, ваш method names should start with a lowercase letter (например setDataOne не SetDataOne, done, а не Done и т.д.), как показано на рисунке выше.

  3. Если вы собираетесь писать свои собственные сеттер, setDataOne, setDataTwo и т.д., вы можете также удалить эти три переменные экземпляр, снимите три setData___ методы, и заменить три переменные экземпляр со свойствами класса (и пусть компилятор синтезирует не только переменные экземпляра, но и сеттеры).

+0

Спасибо, что нашли время, высоко оценили! Насколько 1. идет, это кажется, в моей программе отличная, за исключением того, что она жалуется на знак «@» перед «каким бы то ни было текстом». Что касается 2. идет, отметим пункт. –

+0

И, наконец, что касается трех, я попробуем это, кажется, гораздо более аккуратным и простым, спасибо! –

+0

@MrEmkei Что касается жалобы на «@», я подозреваю, что он действительно жалуется на кавычки. Я просто вырезал и вставил ваш код, но я замечаю, что вы в исходном образце кода использовались фигурные кавычки («закрытие» кавычек), и я обновил свой ответ, чтобы использовать простые старые кавычки. Возможно, вы отредактировали вопрос в каком-то процессоре Word, ced стандартная кавычка с кудрявым исполнением. (Я знаю, что они похожи, но они совершенно разные персонажи.) – Rob

Смежные вопросы