2011-06-08 5 views
0

Я пытаюсь сохранить UIBezierPath и некоторые другие значения в NSDictionary.UIBezierPath в NSDictionary - это возможно?

Я пишу в словаре так:

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

touchesBegan:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
CGPoint touchPoint = [[touches anyObject] locationInView:self.drawImage]; 

path = [[UIBezierPath bezierPath] retain]; 
path.lineCapStyle = kCGLineCapRound; 
path.lineWidth = brushSize; 
[path moveToPoint:touchPoint]; 

[self updateDrawingBoard]; 
} 

touchesEnded:

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
CGPoint touchPoint = [[touches anyObject] locationInView:self.drawImage]; 

[path addLineToPoint:touchPoint]; 

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: path, @"path", r, @"red", g, @"green", b, @"blue", alpha, @"alpha", brushSize, @"size", nil]; 
[paths addObject:dict]; 
[dict release]; 
[path release]; 
path = nil; 

[self updateDrawingBoard]; 
} 

И читать его, как это одна:

- (void) updateDrawingBoard { 
UIGraphicsBeginImageContext(self.drawImage.bounds.size); 

[[UIColor colorWithRed:r green:g blue:b alpha:alpha] setStroke]; 
NSLog(@"count: %d", [paths count]); 
for (NSDictionary *dict in paths) { 
    NSLog(@"dict: %@", dict); 

    //Here I get the error 
    UIBezierPath *p = [dict objectForKey:@"path"]; 
    p.lineWidth = [[dict objectForKey:@"size"]floatValue]; 
    [[UIColor colorWithRed:[[dict objectForKey:@"red"]floatValue] 
        green:[[dict objectForKey:@"green"]floatValue] 
         blue:[[dict objectForKey:@"blue"]floatValue] 
        alpha:[[dict objectForKey:@"alpha"]floatValue]] setStroke]; 
    [p stroke]; 
} 

[path stroke]; 

self.drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
} 

Но я получаю эту ошибку:

[__NSArrayI objectForKey:]: unrecognized selector sent to instance 0x1b0210 

Не думаю, что я делаю что-то неправильно.

словарь журнала:

dict: (
"<UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x1b30a0; state = Possible; enabled = NO; delaysTouchesBegan = YES; view = <UIScrollView 0x1e0380>; target= <(action=delayed:, target=<UIScrollView 0x1e0380>)>>", 
"<UIScrollViewPanGestureRecognizer: 0x1b0b60; state = Possible; enabled = NO; delaysTouchesEnded = NO; view = <UIScrollView 0x1e0380>; target= <(action=handlePan:, target=<UIScrollView 0x1e0380>)>; must-fail = {\n  <UIScrollViewPagingSwipeGestureRecognizer: 0x1ec7c0; state = Possible; enabled = NO; view = <UIScrollView 0x1e0380>; target= <(action=_handleSwipe:, target=<UIScrollView 0x1e0380>)>>\n }>", 
"<UIScrollViewPagingSwipeGestureRecognizer: 0x1ec7c0; state = Possible; enabled = NO; view = <UIScrollView 0x1e0380>; target= <(action=_handleSwipe:, target=<UIScrollView 0x1e0380>)>; must-fail-for = {\n  <UIScrollViewPanGestureRecognizer: 0x1b0b60; state = Possible; enabled = NO; delaysTouchesEnded = NO; view = <UIScrollView 0x1e0380>; target= <(action=handlePan:, target=<UIScrollView 0x1e0380>)>>\n }>" 
) 

словарь без путей: выход

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithFloat:r], @"red", 
         [NSNumber numberWithFloat:g], @"green", 
         [NSNumber numberWithFloat:b], @"blue", 
         [NSNumber numberWithFloat:alpha], @"alpha", 
         [NSNumber numberWithFloat:brushSize], @"size", nil]; 
[paths addObject:dict]; 
[dict release]; 

Вход:

count: 0 
2011-06-09 10:46:28.813 L3T[913:207] count: 1 
2011-06-09 10:46:28.815 L3T[913:207] dict: { 
alpha = 1; 
blue = 0; 
green = 1; 
red = 0; 
size = 5; 
} 
2011-06-09 10:46:32.552 L3T[913:207] count: 1 
sharedlibrary apply-load-rules all 
Current language: auto; currently objective-c 
(gdb) 

Заканчивается также с треском.

+0

@madmax Что означает 'NSLog (@" dict:% @ ", [dict class]);' yield? –

+2

Вы должны добавить больше кода, поскольку ошибка, безусловно, находится в других частях ваших источников. Прямо сейчас вы управляете тем, что на самом деле является NSArray, как если бы это был NSDictionary. – Till

+0

Отредактировал мой вопрос – madmax

ответ

1

Код, который вы опубликовали, хорошо читается. Он тоже должен работать нормально, но я думаю, что ошибка лежит где-то в другом месте. Бревно,

dict: (
"<UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x1b30a0; state = Possible; enabled = NO; delaysTouchesBegan = YES; view = <UIScrollView 0x1e0380>; target= <(action=delayed:, target=<UIScrollView 0x1e0380>)>>", 
"<UIScrollViewPanGestureRecognizer: 0x1b0b60; state = Possible; enabled = NO; delaysTouchesEnded = NO; view = <UIScrollView 0x1e0380>; target= <(action=handlePan:, target=<UIScrollView 0x1e0380>)>; must-fail = {\n  <UIScrollViewPagingSwipeGestureRecognizer: 0x1ec7c0; state = Possible; enabled = NO; view = <UIScrollView 0x1e0380>; target= <(action=_handleSwipe:, target=<UIScrollView 0x1e0380>)>>\n }>", 
"<UIScrollViewPagingSwipeGestureRecognizer: 0x1ec7c0; state = Possible; enabled = NO; view = <UIScrollView 0x1e0380>; target= <(action=_handleSwipe:, target=<UIScrollView 0x1e0380>)>; must-fail-for = {\n  <UIScrollViewPanGestureRecognizer: 0x1b0b60; state = Possible; enabled = NO; delaysTouchesEnded = NO; view = <UIScrollView 0x1e0380>; target= <(action=handlePan:, target=<UIScrollView 0x1e0380>)>>\n }>" 
) 

указывает на то, что по крайней мере один из объектов проталкивается в path массив является массивом, а не NSDictionary объект. Вы не делаете этого в коде выше, поэтому он должен быть где-то еще. Я как-то предполагаю, что вы должны искать view.gestureRecognizers в коде в форме, аналогичной форме,

[paths addObject:view.gestureRecognizers]; 

view, где находится объект Scrollview. Вам придется снять это, если не будет причин, по которым вы это сделали.

+0

Благодарим вас за просмотр кода. Я не знаю, откуда идет ScrollView. Это представление представляет собой подзаголовок другого ViewController, который является подразделением ScrollView. Добавлен некоторый код, а также словарь без путей, только с объектами NSNumber. Но у меня все еще возникает ошибка сегментации. – madmax

+1

Нава Кармон прав. Вы закончили выпуск словаря. –