Сохранить изображение, выбранное из UIImagePickerController - PullRequest
1 голос
/ 08 июля 2011

Я застрял в странной ситуации.В моем сценарии у меня есть 4 различных контроллеров представления.Я хочу изменить фоновое изображение RootViewController, предоставив пользователю возможность выбора из UIImagePickerController в другом представлении.Я делаю это стандартным методом, и он отлично работает.Но как только я перехожу к любому другому виду и возвращаюсь к корневому виду, мое вновь установленное фоновое изображение исчезает.Я хочу сохранить выбранный пользователем фон так же, как он использует мое приложение.Пожалуйста, направьте меня правильно, как я могу сохранить изображение, выбранное пользователем, и использовать его в любом месте моего приложения, хотя пользователь также использует другие виды.

С уважением.

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

Похоже, что когда вы устанавливаете изображение bg, вы фактически не устанавливаете его в rootViewController. Или, если да, то когда он выполняет viewDidUnload, а затем viewDidLoad, изображение bg не сохраняется.

Вы должны поместить изображение, выбранное пользователем, где-нибудь, чтобы rootViewController мог получить к нему доступ при вызове метода viewDidLoad, и переустановить его при вызове этого метода.

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

Перетащите приведенный ниже код в новый класс InspectView и вызовите его следующим образом:

 [InspectView dumpViewToLog:rootViewController.view];

Вот класс:

InspectView.m

 #import "InspectView.h"
 #define THE_LOG NSLog
 @implementation InspectView
 + (void)dumpViewToLog:(id)viewObj  {
THE_LOG(@"%@", [self dumpViewToString: viewObj] );
 }

 + (NSString *)dumpViewToString:(id)viewObj  {

NSString *s =                    @"\nInspect view hierarchy -----------------------------------" ;
s = [ s stringByAppendingFormat: @"\n original view is (0x%x)", viewObj];

// go up to outtermost view.
while ( [viewObj superview] ) {
    viewObj = [viewObj superview];
}

s = [ s stringByAppendingString:[self dumpViewToString: viewObj level:0] ];
s = [ s stringByAppendingString: @"\nEnd of view hierarchy -----------------------------------"];
return s;
 }

 + (NSString *) dumpViewToString:(id)viewObj level:(int) level {
NSString * s=@"\n";
// indent to show the current level
for (int i = 0; i < level; i++) {
    s = [s stringByAppendingString:@".   "];
}

s = [s stringByAppendingFormat:@"%@ (0x%x): frame:(%f,%f) %f x %f [tag=%d] ", [[viewObj class] description], viewObj,
     ((UIView*)viewObj).frame.origin.x, 
     ((UIView*)viewObj).frame.origin.y,
     ((UIView*)viewObj).frame.size.width,
     ((UIView*)viewObj).frame.size.height,
     ((UIView*)viewObj).tag
      ];  // shows the hex address of input view.
//  s = [s stringByAppendingFormat:@"%@ : ", [[viewObj class] description] ];

id obj = [viewObj superclass];

while (NULL != obj) {
    s = [s stringByAppendingFormat: @"%@ : ", [[obj class] description] ];
    obj = [obj superclass];
}

// recurse for all subviews
for (UIView *sub in [viewObj subviews]) {
    s= [s stringByAppendingString: [self dumpViewToString:sub level:(level + 1)]];
}
return s;
 }

 @end

InspectView.h

#define objectString(anObject) [[anObject description] UTF8String]

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

 @interface InspectView : NSObject {}

 + (void)      dumpViewToLog:(id)viewObj  ;
 + (NSString *)dumpViewToString:(id)viewObj;
 + (NSString *)dumpViewToString:(id)viewObj level:(int)level;
 @end
1 голос
/ 08 июля 2011

Я не знаю специфики (вы не предоставили никакого кода), но я предполагаю, что ViewController с пользовательским фоном имеет свой фон, установленный через UIImageView или .backgroundColor = [UIColor colorWithPatternImage: image];

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

Если не понятно, что я имею в виду, вот какой-то код.

AppDelegate Additions

@interface AppDelegate
//Stuff that's already here.
@property (nonatomic, retain) UIImage *backgroundImage;
@end

Просмотр дополнений контроллера

@implementation ViewController

-(void)viewDidLoad{
    self.view.backgroundImage = ((AppDelegate*)[UIApplication sharedApplication].delegate).backgroundImage;
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo{
    ((AppDelegate*)[UIApplication sharedApplication].delegate).backgroundImage = [image retain];  
    //background code here
}

@end
...