2012-02-22 39 views
0

我试图创建一个具有酥料饼下面的代码:UIPopoverController麻烦

//.h 
@interface LoginViewController : UIViewController <UIPopoverControllerDelegate> 
.... 
@end 

//.m 
- (IBAction)popoverTest:(id)sender 
{ 
    UIViewController *popoverContent = [[UIViewController alloc] init]; 
    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]; 

    UILabel *nameLabel = [[UILabel alloc] init]; //edited, fixed UILabel allocation 
    nameLabel.text = @"Person's name"; 
    [nameLabel sizeToFit]; 
    nameLabel.frame = CGRectMake(10, 10, nameLabel.frame.size.width, nameLabel.frame.size.height); 
    [myView addSubview:nameLabel]; 

    popoverContent.view = myView; 

    popoverContent.contentSizeForViewInPopover = CGSizeMake(300, 300); 

    UIPopoverController *popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent]; 
    popoverController.delegate = self; 

    [popoverController presentPopoverFromRect:((UIButton *)sender).frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

    NSLog(@"ran all code"); 
} 

我创建了一个UIView,把一个标签作为一个子视图,然后分配给我的观点给UIViewController.view。然后我创建了一个popover控制器,调整popover控制器的大小,设置委托并从按钮的框架中显示它。

我收到一个SIGABRT,应用程序崩溃。

有什么我失踪了吗?

编辑:我固定UILabel分配。问题总是存在的。

+0

在您的IBAction中放置一个断点并查看它崩溃的位置。启用也[例外](http://stackoverflow.com/questions/4961770/run-stop-on-objective-c-exception-in-xcode-4) – 2012-02-22 17:29:52

回答

3

你的代码很奇怪。

例如为什么你创建一个视图,你把它添加到你的酥料饼的内容有何看法?

然后,你必须关注内存泄漏。你的代码中有很多。

这就是说,这里进行了UIPopoverController内显示一个UIViewcontroller一个简单的例子。

- (IBAction)yourAction:(id)sender 

    UIButton* senderButton = (UIButton*)sender; 

    UIViewController* yourController = [[UIViewController alloc] init]; 

    UIPopoverController* pop = [[UIPopoverController alloc] initWithContentViewController:yourController]; 
    pop.delegate = self; 
    pop.popoverContentSize = CGSizeMake(300, 300);  

    self.popover = pop; 

    [pop presentPopoverFromRect:senderButton.bounds inView:senderButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    pop.passthroughViews = nil; 

    [yourController release]; 
    [pop release]; 
} 

其中self.popover@property与保留策略。以这种方式在UIPopoverControllerDelegate方法(或任何你想要的),你可以释放你的popover和/或解雇它。

希望它有帮助。

P.S.检查代码是因为我手写的。

编辑

通常当你创建一个酥料饼,它的内容视图控制器或者定制UIViewControllerUINavigationController(在这种情况下,你想利用它的导航栏)。

例如,而不是简单的UIViewController的,你可以创建一个自定义的

//.h 
@interface CustomUIViewController : UIViewController 

@end 

//.m 
@implementation CustomUIViewController 

// other code here... 

- (void)viewDidLoad 
{ 
    // here you are sure that the view has been loaded in memory (alternatively override loadView method), so 
    UIView* greenView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]; 
    green.backgroundColor = [UIColor greenColor]; 
    [self.view addSubview:greenView]; 
    [greenView release]; 
} 

@end 

和AA酥料饼

- (IBAction)yourAction:(id)sender 

    UIButton* senderButton = (UIButton*)sender; 

    CustomUIViewController* yourController = [[CustomUIViewController alloc] init]; 

    // same as before... 
} 
+0

感谢您的建议,我会考虑它。我想我应该说我在这个项目中使用ARC。 – Padin215 2012-02-22 20:18:56

+0

重新阅读您的答案,并且您确实建议将我的UIPopoverController变成一个实例变量,这是修复问题的地方 – Padin215 2012-02-22 20:21:05

+0

不客气。 – 2012-02-22 22:02:50

0

这个问题似乎是以下几点:

UILabel *nameLabel; 
nameLabel.text = @"Person's name"; 

nameLabel未初始化。它指向随机存储器,当通过文本属性调用-setText:时,应用程序崩溃。

除了这个,你有几个内存泄漏。请记住:如果您拨打alloc,则必须在release之间。 (我不确定这是如何与新的自动分配/释放工作)。

+0

德哦,是的,我把它改为“UILabel * nameLabel = [[UILabel alloc] init];“但没有解决它。 – Padin215 2012-02-22 17:17:31

1

解决了我的问题from this question.

简短的回答中使用它: ARC不保留UIPopoverController。

我把它作为一个实例变量,工作得很好。