2011-07-08 98 views
1

我陷入了一個奇怪的境地。在我的場景中,我有4個不同的視圖控制器。我想要的是改變RootViewController的背景圖像,讓用戶在另一個視圖中選擇UIImagePickerController。我通過標準方法來完成它,它工作正常。但是,只要我轉到任何其他視圖並回到根視圖,我新設置的背景圖像就消失了。我想保留用戶選擇的背景,就像他使用我的應用程序一樣。請引導我正確的方式,即如何保留用戶選擇的圖像並將其用於我的應用程序中的任何位置,但用戶也將轉到其他視圖。從UIImagePickerController中選擇保留圖像

問候。

回答

1

我不知道具體情況(你沒有提供任何代碼),但我猜想與自定義背景的ViewController通過UIImageView或.backgroundColor = [UIColor colorWithPatternImage:image]設置它的背景。

無論哪種方式,我猜想它會消失,因爲您重新創建視圖和圖像的引用只保存在該對象本身(它現在被銷燬)。您需要保留圖片並在appdelegate中保留對其的引用。

如果不清楚我的意思,這裏是一些代碼。

的AppDelegate附加

@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 
+0

感謝您的理解和一個​​不錯的代碼片段,但除了我的信息給,我也想提一下,我正在改變UIButton'[myBtn setBackgroundImage:img forState:UIStateNormal'的背景。請在這種情況下引導我。謝謝。 – Wasim

+0

忽略我以前的評論。你的建議代碼像一個魅力:)感謝噸..!我在解決這個問題後面臨更多的問題,很快會回覆給你:) – Wasim

3

這聽起來像當你設置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 * [email protected]"\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 
+0

that..that是美麗的。 +1爲一個偉大的片段。 –

+0

非常好,我不能贊成兩次的恥辱。謝謝Rayfleck。 –

+0

@BP,好吧,你可以告訴你所有的朋友...... :-) – Rayfleck

相關問題