2016-01-01 3 views
0

Другой вопрос новичка. Я пытаюсь понять, как эффективно использовать область для организации моих проектов с использованием классов для хранения данных вместо того, чтобы иметь все на контроллере представления. Итак, я работаю над несколькими версиями простого проекта, чтобы понять, как работает область действия. У меня есть контроллер просмотра, подключенный к представлению. В этом представлении есть кнопки, которые при нажатии отображают изображения. Я хочу добавить еще одну кнопку, которая рандомизирует изображения. У меня также есть класс под названием «Карты» для хранения карт и методов создания и перетасовки карт. Я дублировал проект, поэтому у меня есть тот, который работает, и тот, который этого не делает.Область применения методов

Первый проект. Это файлы:

вид контроллера ч файл:

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

@interface ViewController : UIViewController 

- (IBAction)buttonPressed:(id)sender; 

@end 

вид Контроллер илит м файл:

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    Cards *instance = [[Cards alloc] init]; 

    instance.images = [instance createImages]; 

    NSLog(@"I've got %lu Images", (unsigned long)instance.images.count); 

    instance.shuffled = [instance shuffleImages]; 

    NSLog(@"Image numbers shuffled: %@", instance.shuffled); 
    } 

- (IBAction)buttonPressed:(id)sender { 

    //Nothing hooked to this yet 

} 

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

@end 

Карта ч Файл:

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 

@interface Cards : NSObject 

// Creating Images 

@property NSMutableArray *images; 

- (NSMutableArray*) createImages; 

//Shuffling Images 

@property NSMutableArray *shuffled; 

- (NSMutableArray*) shuffleImages; 

@end 

карта м файл:

#import "Cards.h" 

@implementation Cards 

- (NSMutableArray*) createImages{ 
    self.images = [[NSMutableArray alloc] initWithObjects: 

        [UIImage imageNamed:@"Image1.png"], 
        [UIImage imageNamed:@"Image2.png"], 
        [UIImage imageNamed:@"Image3.png"], 
        [UIImage imageNamed:@"Image4.png"], nil]; 

    return self.images; 
} 

- (NSMutableArray*) shuffleImages{ 

    NSUInteger imageCount = [self.images count]; 

    NSMutableArray *localvar = [[NSMutableArray alloc]init]; 

    for (int tileID = 0; tileID < imageCount; tileID++){ 
     [localvar addObject:[NSNumber 
          numberWithInt:tileID]]; 
    } 

    for (NSUInteger i = 0; i < imageCount; ++i) { 
      NSInteger nElements = imageCount - i; 
      NSInteger n = (arc4random() % nElements) + i; 
      [localvar exchangeObjectAtIndex:i 
            withObjectAtIndex:n]; 
    } 

    return localvar; 
} 

@end 

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

2015-12-31 23:43:44.885 VCScope[2138:533369] I've got 4 Images 
2015-12-31 23:43:44.886 VCScope[2138:533369] Image numbers shuffled: (
    0, 
    2, 
    3, 
    1 
) 

Второй проект:

То, что я хочу сделать, это положить кнопку Randomize изображения только при нажатии кнопки и а не как часть viewDidLoad. Итак, в моем втором проекте у меня есть те же файлы для view.h и для карт.h и Cards.m, но на контроллере view.m. Я перемещаю вызов метода для перетасовки карт к способу UIButton, например, так:

нового View контроллер м файл:

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    Cards *instance = [[Cards alloc] init]; 

    instance.images = [instance createImages]; 

    NSLog(@"I've got %lu Images", (unsigned long)instance.images.count); 

    } 

- (IBAction)buttonPressed:(id)sender { 

    Cards *instance = [[Cards alloc] init]; 

    instance.shuffled = [instance shuffleImages]; 

    NSLog(@"Image numbers shuffled: %@", instance.shuffled); 

} 

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

@end 

Это выводит на консоль следующего:

2015-12-31 23:32:07.495 4StackVCScope[2029:486608] I've got 4 Images 
2015-12-31 23:32:11.924 4StackVCScope[2029:486608] Image numbers: (
) 

так что это не работает, и я предполагаю, что это в делать с объемом. Может кто-то пролить свет на это? спасибо

ответ

1

Добро пожаловать в переполнение стека. Вы упоминаете, что вы «новичок», но было бы полезно узнать, какой у вас фона, поэтому я знаю, сколько здесь нужно.

Cards *instance = [[Cards alloc] init];

создает свежий экземпляр карты в локальной переменной. Вы делаете это отдельно внутри -viewDidLoad и в -buttonPressed:.

Если вам нужен один объект карты на ViewController, тогда для контроллера представления необходимо иметь хранилище для каждого экземпляра. Существует несколько возможных способов сделать это. Какой из них вы выбираете, это вопрос стиля кода и дизайна API.

Если экземпляр карты предназначен только для внутреннего использования, вы можете объявить Ивар в вашем @implementation блоке:

@implementation ViewController { 
    Cards *_cards; 
} 

- (void)viewDidLoad { _cards = ... } 

- (IBAction)buttonPressed:(id)sender { access _cards } 

@end 

(Иварс может быть объявлен в общественном @interface, как хорошо, но я бы не рекомендовал, что как это просачивается детали реализации)

Или вы можете использовать свойство в открытом интерфейсе:.

// in your .h file: 
@interface ViewController 
@property (nonatomic) Cards *cards; 
@end 

// in your @implementation: 
- (void)viewDidLoad { self.cards = ... } 

- (IBAction)buttonPressed:(id)sender { access self.cards } 

Свойс y также могут быть объявлены в частном порядке в формате class extension:

// in your .m file: 
@interface ViewController() 
@property (nonatomic) Cards *cards; 
@end 
+0

Это очень полезно. Спасибо и с новым годом! – Paul

+1

Рад это слышать; ты тоже! Дополнительная информация (хотя, возможно, документ немного устарел): https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html – jtbandes

+1

Второй шаблон не только в равной степени действителен , это рекомендуемая практика. Объявление переменных экземпляра действительно больше не выполняется за пределами нескольких редких ситуаций. – bbum

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