Другой вопрос новичка. Я пытаюсь понять, как эффективно использовать область для организации моих проектов с использованием классов для хранения данных вместо того, чтобы иметь все на контроллере представления. Итак, я работаю над несколькими версиями простого проекта, чтобы понять, как работает область действия. У меня есть контроллер просмотра, подключенный к представлению. В этом представлении есть кнопки, которые при нажатии отображают изображения. Я хочу добавить еще одну кнопку, которая рандомизирует изображения. У меня также есть класс под названием «Карты» для хранения карт и методов создания и перетасовки карт. Я дублировал проект, поэтому у меня есть тот, который работает, и тот, который этого не делает.Область применения методов
Первый проект. Это файлы:
вид контроллера ч файл:
#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: (
)
так что это не работает, и я предполагаю, что это в делать с объемом. Может кто-то пролить свет на это? спасибо
Это очень полезно. Спасибо и с новым годом! – Paul
Рад это слышать; ты тоже! Дополнительная информация (хотя, возможно, документ немного устарел): https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html – jtbandes
Второй шаблон не только в равной степени действителен , это рекомендуемая практика. Объявление переменных экземпляра действительно больше не выполняется за пределами нескольких редких ситуаций. – bbum