2012-07-07 53 views
2

我使用初始ViewController將項目創建爲Single View Application;將subViewController添加到項目。具有平移手勢的UIImageView被添加到兩個視圖控制器中。
它工作在viewController.m, 但是當它被添加到subViewController和子視圖中添加子視圖到視圖控制器,該計劃只是「EXC_BAD_ACCESS」崩潰..平移手勢導致子視圖崩潰?

任何人有一些解決方案?

這裏是我的代碼:

ViewController.m

#import "ViewController.h" 
#import "SubViewController.h" 

//#define SUB 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

#ifdef SUB 
    SubViewController *sb = [[SubViewController alloc] init]; 
    [self.view addSubview:sb.view]; 
#else 
    UIImageView* img_ = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"monkey_1.png"]]; 
    img_.userInteractionEnabled = YES; 
    UIPanGestureRecognizer *stampPanGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
    [stampPanGesture setMinimumNumberOfTouches:1]; 
    [stampPanGesture setMaximumNumberOfTouches:1]; 
    [img_ addGestureRecognizer:stampPanGesture]; 
    img_.center = self.view.center; 
    [self.view addSubview:img_]; 
#endif 
} 


- (void)handlePan:(UIPanGestureRecognizer *)recognizer { 
    CGPoint translation = [recognizer translationInView:self.view]; 
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
             recognizer.view.center.y + translation.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; 

} 

SubViewController.m

#import "SubViewController.h" 
@interface SubViewController() 

@end 

@implementation SubViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 


    UIImageView* img_ = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"monkey_1.png"]]; 
    img_.userInteractionEnabled = YES; 
    UIPanGestureRecognizer *stampPanGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
    [stampPanGesture setMinimumNumberOfTouches:1]; 
    [stampPanGesture setMaximumNumberOfTouches:1]; 
    [img_ addGestureRecognizer:stampPanGesture]; 
    img_.center = self.view.center; 
    [self.view addSubview:img_]; 
} 


- (void)handlePan:(UIPanGestureRecognizer *)recognizer { 
    CGPoint translation = [recognizer translationInView:self.view]; 
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
             recognizer.view.center.y + translation.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; 

} 

回答

2

假設這是ARC代碼,問題是,你正在創建子視圖的視圖控制器,抓住它的觀點,然後讓控制器本身超出範圍並被釋放。

立即解決的辦法是讓SubViewController *sb成爲主視圖控制器類的一個實例變量,這樣它就不會超出範圍,也不會被釋放在你後面。

事情是,雖然這可能會解決你的崩潰,但更大的圖片問題是,你真的不應該抓住一個視圖控制器的視圖,並將其添加爲子視圖,但無所事事的控制器本身。例如,如果你這樣做,各種事情可能無法正常工作(例如,旋轉事件永遠不會到達你的子視圖; iOS需要與視圖控制器通信的任何東西可能不會被你的子視圖控制器接收;我不知道在世界didReceiveMemoryWarning情況會做,等等)。總之,Apple建議不要這樣做,並鼓勵您保持視圖層次結構和視圖控制器層次結構同步。

因此,如果您正在轉換到新視圖,您應該通過pushViewControllerpresentViewController來完成。如果這確實是一個子視圖(例如,先前視圖的某些部分將保留在屏幕上,並且子視圖將只佔用屏幕的一部分),則您可以使用View Controller Containment。有關遏制的更多信息,您可以看到WWDC 2011 session 102。但毫無疑問,這對你想要做的事情來說過分了。推/提出子視圖可能是合乎邏輯的解決方案。