2013-02-20 35 views
0

Xcode中的iOS不登记:的iOS引用的NSMutableArray中的对象 - 解读语法

currentCard = [myBook getCard:cardIndex]; 

在一个特定的指数有一些困难,调用get方法(名称),用于字符串, 对象(addressCard)内(int index),在一个对象(addressBook)内的 NSMutableArray(book)中。

基本上,一个iOS viewController拥有自己的addressBook实例,该实例在其实例化的NSMutableArray中包含addressCards。然而,在viewController的viewLoad中,AddressBook却没有获得该卡片。

在这种特殊情况下是否存在一些特定的语法形式?

相当新的iOS,因为它的应用程序有几个文件,但主要问题直接关系到addressBook.m的addCard和getCard方法。项目基于Kochan学习Objective-C的教训,如果任何人熟悉它(或者可以推荐更好的学习iOS源代码)。

Method within AddressBook.m 

//Add a method for getting the current card in view 
-(AddressCard*) getCard: (int) index{ 
    AddressCard *cardC = [book objectAtIndex:index]; 
    return cardC;  
} 


ViewController.m 

#import "ViewController.h" 


@interface ViewController() 

@end 

@implementation ViewController 
{ 
    BOOL isNew; 
    int cardIndex; 
    AddressBook *myBook; 
    AddressCard *currentCard; 
    BOOL cardChanged; 
} 


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


    //Initialize the Address Book 
    NSString *presetName1 = @"Dave Strider"; 
    NSString *presetName2 = @"Rose Tyler"; 
    NSString *presetName3 = @"Sherlock Holmes"; 

    NSString *presetEmail1 = @"[email protected]"; 
    NSString *presetEmail2 = @"DoctorsBetterHal[email protected]"; 
    NSString *presetEmail3 = @"[email protected]"; 


    AddressCard *card1 = [[AddressCard alloc]init]; 
    AddressCard *card2 = [[AddressCard alloc]init]; 
    AddressCard *card3 = [[AddressCard alloc]init]; 

    [card1 setName: presetName1 andEmail:presetEmail1]; 
    [card2 setName: presetName2 andEmail:presetEmail2]; 
    [card3 setName: presetName3 andEmail:presetEmail3]; 

    [myBook addCard:card1]; 
    [myBook addCard:card2]; 
    [myBook addCard:card3]; 



    //set the addybook index to zero 
    cardIndex = 0; 

    //set card to current card 
    //***** ISSUE IS HERE ***** 
    currentCard = [myBook getCard:cardIndex]; 




    //set field values ***** currentCard gains no variables. 
    [_nameField setText:[currentCard name]]; 
    [_emailField setText:[currentCard email]]; 

    isNew = false; 
    cardChanged = false; 

    //***** TESTING SYNTAX ***** 
    // This method however works perfectly, the card, and its string are accepted **** 
    // [_nameField setText:[card1 name]]; 

    // [_nameField setText:presetName1]; 
    // [_emailField setText:presetEmail1]; 
} 


- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 





- (IBAction)btnNext_touch:(id)sender { 
//check bools 



//go to next card, check for last. 
    int i = [myBook entries]; 
    if (i == cardIndex) 
    {cardIndex = 0;} 
    else { 
     cardIndex++; 
    } 



//reset current bools 
    isNew = false; 
    cardChanged = false; 


    //set card to current card 
    currentCard = [myBook getCard:cardIndex]; 

    //set field values 
    [_nameField setText:[currentCard name]]; 
    [_emailField setText:[currentCard email]]; 

} 

- (IBAction)nameFieldChanged:(id)sender { 
    cardChanged = true; 

    // if (isNew != true) 
    // { 

    // [_nameField setText:[]; 
    //} else{ 

    //} 
} 

- (IBAction)emailFieldChanged:(id)sender { 
    cardChanged = true; 
} 


@end 

这里是其余的类,如果他们会提供额外的帮助理解这个nubby问题。

ViewController.h 
// 
// ViewController.h 
// Lozano007-p4 
// 
// Created by antonio a lozano ii on 2/19/13. 
// Copyright (c) 2013 antonio a lozano ii. All rights reserved. 
// 

#import <UIKit/UIKit.h> 
#import "AddressBook.h" 


@interface ViewController : UIViewController 


@property (strong, nonatomic) IBOutlet UITextField *nameField; 
@property (strong, nonatomic) IBOutlet UITextField *emailField; 


@property (strong, nonatomic) IBOutlet UIButton *btnNext; 


- (IBAction)btnNext_touch:(id)sender; 

- (IBAction)nameFieldChanged:(id)sender; 
- (IBAction)emailFieldChanged:(id)sender; 


@end 



AddressCard.h 

// 
// AddressCard.h 
// Lozano007-p4 
// 
// Created by antonio a lozano ii on 2/19/13. 
// Copyright (c) 2013 antonio a lozano ii. All rights reserved. 
// 

#import <Foundation/Foundation.h> 
@interface AddressCard : NSObject <NSCopying, NSCoding> 

@property (nonatomic, copy) NSString *name, *email; 
-(void) setName: (NSString *) theName andEmail: (NSString *) theEmail; 
-(void) assignName: (NSString *) theName andEmail: (NSString *) theEmail; 
-(NSComparisonResult) compareNames: (id) element; 
-(void) print; 
@end 


AddressCard.m 
// 
// AddressCard.m 
// Lozano007-p4 
// 
// Created by antonio a lozano ii on 2/19/13. 
// Copyright (c) 2013 antonio a lozano ii. All rights reserved. 
// 

#import "AddressCard.h" 

@implementation AddressCard 
@synthesize name, email; 

-(void) setName: (NSString *) theName andEmail: (NSString *) theEmail 
{ 
    self.name = theName; 
    self.email = theEmail; 
} 

// Compare the two names from the specified address cards 
-(NSComparisonResult) compareNames: (id) element 
{ 
    return [name compare: [element name]]; 
} 

-(void) print 
{ 
    NSLog (@"===================================="); 
    NSLog (@"|         |"); 
    NSLog (@"| %-31s |", [name UTF8String]); 
    NSLog (@"| %-31s |", [email UTF8String]); 
    NSLog (@"|         |"); 
    NSLog (@"|         |"); 
    NSLog (@"|         |"); 
    NSLog (@"|  O    O   |"); 
    NSLog (@"===================================="); 
} 

-(id) copyWithZone: (NSZone *) zone 
{ 
id newCard = [[[self class] allocWithZone: zone]init]; 
       [newCard assignName: name andEmail: email]; 
       return newCard; 
} 

       -(void) assignName: (NSString *) theName andEmail: (NSString *) theEmail 
{ 
        name = theName; 
        email = theEmail; 
} 
       -(void) encodeWithCoder: (NSCoder *) encoder 
{ 
        [encoder encodeObject: name forKey: @"AddressCardName"]; 
        [encoder encodeObject: email forKey: @"AddressCardEmail"]; 
} 
       -(id) initWithCoder: (NSCoder *) decoder 
{ 
    name = [decoder decodeObjectForKey: @"AddressCardName"]; 
    email = [decoder decodeObjectForKey: @"AddressCardEmail"]; 
    return self; 
} 


@end 


AddressBook.h 

// 
// AddressBook.h 
// Lozano007-p4 
// 
// Created by antonio a lozano ii on 2/19/13. 
// Copyright (c) 2013 antonio a lozano ii. All rights reserved. 
// 

#import <Foundation/Foundation.h> 
#import "AddressCard.h" 
@interface AddressBook: NSObject <NSCopying, NSCoding> 

//{ 

//Add a mutable array for the address cards 
    // NSMutableArray *cardArray; 

//} 


@property (nonatomic, copy) NSString *bookName; 
@property (nonatomic, strong) NSMutableArray *book; 
-(id) initWithName: (NSString *) name; 
-(void) sort; 
-(void) addCard: (AddressCard *) theCard; 
-(void) sort2; 
-(void) removeCard: (AddressCard *) theCard; 
-(int) entries; 
-(void) list; 
-(AddressCard *) lookup: (NSString *) theName; 

//Add a getMethod for the Current Display'd card. 
-(AddressCard*) getCard: (int) index; 
@end 


AddressBook.m 
// 
// AddressBook.m 
// Lozano007-p4 
// 
// Created by antonio a lozano ii on 2/19/13. 
// Copyright (c) 2013 antonio a lozano ii. All rights reserved. 
// 

#import "AddressBook.h" 

@implementation AddressBook 

@synthesize book, bookName; 

// set up the AddressBook's name and an empty book 
-(id) initWithName: (NSString *) name 
{ 
    self = [super init]; 

    if (self) { 
     bookName = [NSString stringWithString: name]; 
     book = [NSMutableArray array]; 

    } 

    return self; 
} 

-(id) init 
{ 
    return [self initWithName: @"Unnamed Book"]; 
      } 


// Write our own book setter to create a mutable copy 
-(void) setBook: (NSArray *) theBook 
{ 
book = [theBook mutableCopy]; 
} 


-(void) sort 
{ 
[book sortUsingSelector: @selector(compareNames:)]; 
} 




// Alternate sort using blocks 
-(void) sort2 
{ 
[book sortUsingComparator: 
    ^(id obj1, id obj2) { 
        return [[obj1 name] compare: [obj2 name]];}]; 
} 


-(void) addCard: (AddressCard *) theCard 
{ 
    [book addObject: theCard]; 
} 



-(void) removeCard: (AddressCard *) theCard 
{ 
    [book removeObjectIdenticalTo: theCard]; 
} 


-(int) entries 
{ 
    return [book count]; 
} 


-(void) list 
{ 
    NSLog (@"======== Contents of: %@ =========", bookName); 

    for (AddressCard *theCard in book) 
     NSLog (@"%-20s %-32s", [theCard.name UTF8String], 
       [theCard.email UTF8String]); 

    NSLog (@"=================================================="); 
} 

// lookup address card by name — assumes an exact match 



-(AddressCard *) lookup: (NSString *) theName 
{ 
    for (AddressCard *nextCard in book) 
     if ([[nextCard name] caseInsensitiveCompare: theName] 
      == NSOrderedSame) 
      return nextCard; 

    return nil; 
} 


-(void) encodeWithCoder: (NSCoder *) encoder 
{ 
    [encoder encodeObject:bookName forKey: @"AddressBookBookName"]; 
    [encoder encodeObject:book forKey: @"AddressBookBook"]; 
} 



-(id) initWithCoder: (NSCoder *) decoder 
{ 
    bookName = [decoder decodeObjectForKey: @"AddressBookBookName"]; 
    book = [decoder decodeObjectForKey: @"AddressBookBook"]; 

    return self; 
} 


// Method for NSCopying protocol 



-(id) copyWithZone: (NSZone *) zone 
    { 
id newBook = [[[self class] allocWithZone: zone] init]; 

[newBook setBookName: bookName]; 

// The following will do a shallow copy of the address book 
    [newBook setBook: book]; 

     return newBook; 
    } 


//Add a method for getting the current card in view 
-(AddressCard*) getCard: (int) index{ 
    AddressCard *cardC = [book objectAtIndex:index]; 
    return cardC; 

} 
@end 

- 再次,没有特别的代码生成一个错误消息。更重要的是,顶部指定的代码行对代码没有任何影响。

+0

什么是你看到的错误? – 2013-02-20 11:13:37

+0

约定是不使用“get”作为前缀getters。取而代之的是一个名为'getCard:'的方法。以get开头的方法预计会通过引用返回值。遵循约定不仅使其他人能够轻松理解您的代码,而且也是编译器和分析器使用的提示。 – zaph 2013-02-20 11:15:53

+0

我应该指定,它不是一个错误,它只是,我使用的语法不更新currentCard - viewController.m的((void)viewDidLoad方法 – user1815714 2013-02-20 11:16:29

回答

0

这是ViewController的整个源代码吗?如果是这样,我看不到您创建地址簿实例的位置。

一般来说,如果你发送消息给某事而没有发生任何事情,你应该检查看看“某事”不是零。在你的java时代,你会看到一个NPE。在这种语言中,没有任何反应。 'myBook'可能在这里。

像这样的事情在viewDidLoad应该做的:

myBook = [[AddressBook alloc] initWithName:@"Some Name"]; 
+0

我相信我在实现中声明了它,但也许这样做并不会在内存中分配它。 我将尝试这个和总览alloc/init – user1815714 2013-02-20 12:40:34

+0

伊娃尔宣言为您提供指向地址簿的指针的空间。它实际上并没有分配或初始化指针指向的地址簿。 – 2013-02-20 12:44:08

+0

你是对的。没有为myBook或currentCard分配。 :O 感谢您*指出这一点。 – user1815714 2013-02-21 00:59:06

相关问题