Инициализация класса Objective-C и iPhone и доступ к объектам класса, созданным в классе init - PullRequest
1 голос
/ 26 января 2012

Сначала хороший день и спасибо, что нашли время ответить на мой вопрос.

Некоторые предыстории: я сделал то же самое в обычной программе OS X в том, что я запускаю все в main.m

Что я делаю:

созданиеОЧЕНЬ грубое приложение, которое добавляет текстовое поле FirstName и LastName.Пользователь вводит некоторый текст, и когда он нажимает добавить в адресную книгу, программа получает информацию о строке и добавляет ее в NSMutableArray

, как я сказал ОЧЕНЬ грубо, но для целей обучения.

Что не так:

Файлы AddressBook.h и AddressBook.m

AddressBook.h

#import <Foundation/Foundation.h>

@interface AddressBook : UIViewController
{
    NSMutableArray *nameArray;

}

@property (nonatomic, copy) NSMutableArray *nameArray;


@end

AddressBook.m

#import "AddressBook.h"

@implementation AddressBook
@synthesize nameArray;
@end

примечания и комментарии

Итак, я получаю, что я создаю класс с именем AddressBook, и у него есть NSMutableArray

Я знаю, что если я хочу создать новыйобъект, который является частью класса AddressBook. Я бы назвал его в main.m следующим образом: AddressBook * newAddressBook = [AddressBook new];newAddressBook.nameArray = [NSMutableArray array];тогда я мог бы делать то, что я хочу.Я успешно создал такую ​​программу, но не версию для iPhone.


BIDViewController.h

#import <UIKit/UIKit.h>
#import "AddressBook.h"
@interface BIDViewController : UIViewController
{
    AddressBook *myBook;
    UITextField *firstNameField;
    UITextField *lastNameField;
    NSString *tester;
    id myTempBook;

}
//@property (retain, nonatomic) AddressBook *myBook;
@property (retain, nonatomic) IBOutlet UITextField *firstNameField;
@property (retain, nonatomic) IBOutlet UITextField *lastNameField;
@property (copy, nonatomic) NSString *tester;
@property (retain, nonatomic) id myTempBook;
- (IBAction)addToAddressButton:(id)sender;
- (IBAction)textFieldDoneEditing:(id)sender;
- (IBAction)displayAddress:(id)sender;

@end

BIDViewController.m

#import "BIDViewController.h"
@implementation BIDViewController
@synthesize lastNameField, firstNameField, tester;
//@synthesize myBook;
@synthesize myTempBook;



- (IBAction)textFieldDoneEditing:(id)sender
{
    //keyboard stuff
    //give control back to view
    [sender resignFirstResponder];
}
- (IBAction)displayAddress:(id)sender
{
    //display address book array
}
- (IBAction)addToAddressButton:(id)sender
{

    //add the names to array
    //here is what I want to do
    [myBook.nameArray addObject:lastNameField.text];

    //ever time I NSLog the array with objectAtIndex:0 
    //it returns null.  I've tried EVERY combinations of stuff I even tried
    //allocating a new array
   //such as myBook.nameArray = [NSMutableArray array]; and I still could not return anything but null :( 

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    //myBook.nameArray = [NSMutableArray array];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

Мой вопрос:

что я делаю не так, потому что выполнил ту же самую концепцию, но запустил программу в main.m.

Мне кажется, я понимаю, что происходит ...

  1. Программа iPhone загружает BIDViewController, когда пользователь нажимает на значок приложения.
  2. , поскольку BIDViewController инициализируется, он создает myBook, который является объектом в классе AddressBook.он автоматически получает и устанавливает с @synthesize
  3. , мой BIDViewController видит, что он создан, и я могу без проблем записывать в массив, однако где-то по пути я продолжаю получать нулевые возвраты.

Другие примечания

Я могу поделиться своей программой, где я успешно выполнил то, что хотел в приложении не для iPhone, а в простой версии командной консоли.

1 Ответ

4 голосов
/ 26 января 2012

Вы ни в коем случае не создаете myBook.Это всегда будет ноль, так что вы никогда не сможете ничего сделать со свойством массива.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...